Javascript:函数绑定不适用于调用者

问题描述 投票:2回答:1

我有一个调用函数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>
javascript function this bind
1个回答
2
投票

[一个绑定函数基本上使用绑定的this调用它绑定的函数¹,因此代码的调用栈看起来像]

 [Bound] test.foo -> test.foo -> bar

因此,从bar的角度来看,它是从test.foo而不是绑定函数中调用的。²


¹spec中所述:

绑定函数是一个包装另一个函数对象的奇异对象。绑定函数是可调用的(它具有[[Call]]内部方法,并且可能具有[[Construct]]内部方法)。 调用绑定函数通常会导致调用其包装函数


²wether function.caller返回最高的调用堆栈条目不是很清楚,因为未指定。这是一个假设。

© www.soinside.com 2019 - 2024. All rights reserved.