传递成员时在 JavaScript 中丢失“this”上下文
IT技术
javascript
2021-01-22 03:48:31
3个回答
为什么当我尝试调用 at 时这是未定义的?
因为在 JavaScript 中,this
主要取决于函数的调用方式,而不是定义它的位置。在调用中a.t()
设置this
为a
,但l()
设置this
为undefined
(在严格模式下)或全局对象(在松散模式下)。
更多(在我的博客上):
唯一的例外是“绑定”函数(与Function#bind
)或 ES6 的“箭头”函数(this
从定义它们的上下文中获取它们)。
如何在不过度冗长或存储太多的情况下恢复该上下文?
Function#bind
通常是一个很好的答案:
var l = a.t.bind(a);
l();
它返回一个新函数,当调用该函数时,将使用this
set调用原始函数为您提供的第一个参数bind
。(您也可以绑定其他参数。)这是一个 ES5 函数,但如果您需要支持非常旧的浏览器,您可以轻松地对它进行 polyfill。
如果您只需要使用特定值调用 ,而不总是使用该值,正如Robert Rossmann 指出的那样,您可以使用or :l
this
Function#call
Function#apply
l.call(this, 'a', 'b', 'c'); // Calls `l` with `this` set to `a` and args 'a', 'b', and 'c'
l.apply(this, ['a', 'b', 'c']); // Calls `l` with `this` set to `a` and args 'a', 'b', and 'c' -- note they're specified in an array
JavaScript 是功能范围的,
要为此执行具有正确值的函数,您需要将其绑定到正确的对象。例如,
var l= a.t.bind(a);
因为当您将函数分配给新变量时上下文会发生变化。你总是可以这样做a.t();
。