трассировка стека связанной функции

Что происходит с трассировкой стека, когда вы вызываете .bind() для функции javascript ?

Например, когда у меня есть

Function.prototype.arg = function() {
    var fn = this;
    return function augmented(){
        // do something with the arguments
        fn.apply(c, args); // and call it
    };
}

и использовать его в функции

(function x(){console.trace();}).arg()()

он будет регистрировать

x
augmented
<global context>

Так что же делает bind() (внутренне)? Он также выполняет функции частичного применения и установки контекста, такие как arg(), как вы можете видеть в различных оболочках (например, функция совместимости MDC).

Из спецификаций ecmascript я знаю, что он создаст новую функцию и установит ее внутренние свойства для хранения контекста и аргументов, но это всего лишь указатель на исходную функцию (вы можете видеть это на прототипе). Пока что,

(function x(){console.trace();}).bind()()

будет только регистрировать

x
<global context>

Действительно ли внутри нет лишнего вызова, или он только скрыт от метода трассировки?


person Bergi    schedule 15.04.2012    source источник
comment
Если использовать встроенный bind, то лишнего вызова может и не быть. Более того, с оптимизацией встраивания все еще может не быть лишнего вызова.   -  person kirilloid    schedule 16.04.2012
comment
Да, я хочу знать, что происходит, когда используется встроенная функция bind().   -  person Bergi    schedule 16.04.2012
comment
Зависит от реализации. Например, в Chrome я вижу связанную функцию, представленную как (anonymous function) в трассировщике.   -  person kangax    schedule 22.04.2012
comment
Возможный дубликат Всегда ли в стеке вызовов JS есть хотя бы один рамка?   -  person Paul Sweatte    schedule 24.10.2015
comment
@PaulSweatte: Нет, действительно нет. Кстати, я ответил на этот другой вопрос :-)   -  person Bergi    schedule 24.10.2015