我有一个调用函数foo
的函数bar
。 [foo
绑定到元素test
。
[被调用时,bar
将其caller
功能(foo
)存储在集合s
中。现在,当我在foo
中运行函数s
时,奇怪的是this
现在设置为Window
。但是我确实绑定了该函数,所以我出了什么问题?
var s = new Set();
function bar() {
s.add(bar.caller)
}
var test = document.getElementById('test');
test.foo = (function() {
bar();
console.log(this);
}).bind(test);
test.foo(); // output: test div
s.forEach(fn => fn()); // output: Window object
<div id="test"></div>
[一个绑定函数基本上使用绑定的this调用它绑定的函数¹,因此代码的调用栈看起来像]
[Bound] test.foo -> test.foo -> bar
因此,从bar的角度来看,它是从test.foo
而不是绑定函数中调用的。²
¹spec中所述:
绑定函数是一个包装另一个函数对象的奇异对象。绑定函数是可调用的(它具有[[Call]]内部方法,并且可能具有[[Construct]]内部方法)。 调用绑定函数通常会导致调用其包装函数
²wether function.caller
返回最高的调用堆栈条目不是很清楚,因为未指定。这是一个假设。