当您调用.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() 那样做部分应用程序和设置上下文的事情,正如您在各种 shims 中看到的那样(例如MDC 的兼容性功能)。
我从 ecmascript 规范中知道它将创建一个新函数,并设置其内部属性以存储上下文和参数,但它仍然只是指向原始函数的指针(您可以通过原型看到它)。然而,
(function x(){console.trace();}).bind()()
只会记录
x
<global context>
里面真的没有额外的调用,还是只是隐藏在跟踪方法中?