Что происходит с трассировкой стека, когда вы вызываете .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>
Действительно ли внутри нет лишнего вызова, или он только скрыт от метода трассировки?
bind
, то лишнего вызова может и не быть. Более того, с оптимизацией встраивания все еще может не быть лишнего вызова. - person kirilloid   schedule 16.04.2012(anonymous function)
в трассировщике. - person kangax   schedule 22.04.2012