gpt4 book ai didi

javascript - 如何确定 JavaScript 回调函数的执行上下文?

转载 作者:行者123 更新时间:2023-11-30 12:33:08 25 4
gpt4 key购买 nike

当函数作为对象属性被调用时,this 被设置为父对象。有类似的规则适用于将函数作为构造函数或事件处理程序调用,但是在浏览了我数不清的关于 JS Scope 的文章并深入研究了 ECMA5.1 规范之后,我无法准确地整理出来当函数作为回调传递时如何设置执行上下文。

这段代码清楚地表明,一个方法作为回调传递给另一个方法,即使在同一个对象中,也会恢复到全局执行上下文(在浏览器和 Node.js 中)。

var name = 'global';
var self = function() {
return this.name;
}
var cback = function(ff) {
return ff();
}
var parent = {
name: 'parent',
cback: function(ff) {
return ff();
},
self: function() {
return this.name;
}
}
console.log(parent.cback(parent.self)); // Returns "global"

任何人都可以帮助我理解为什么回调是在全局上下文而不是在parent 对象的上下文中执行的吗?我最好的猜测是,任何作为参数传递的函数在分配给局部变量(上例中的 ff)时都会替换其先前的执行上下文,这意味着调用它会传递未定义的 thisArg 并转移到全局上下文(禁止严格模式,或在执行前作为方法附加到新对象),但我犹豫要不要依赖它而不是猜测。

最佳答案

how Execution Context is set when a function is passed as a callback

我认为理解的关键是这些过程是完全独立的。

any function passed as an argument has its previous execution context replaced when it's assigned to a local variable

不是真的。函数本身根本没有任何执行上下文。

执行上下文仅在调用函数时创建。只有调用函数的方式才能确定执行上下文的属性,例如它的 this 值。

例如,

When a function is called as an object property, this is set to the parent object.

例如parent.cback(…)。被调用的函数被属性引用,基引用(parent)将成为调用的 this 上下文。

或者,当一个函数作为普通函数被调用时,this 被设置为 undefined(或者草率模式下的全局对象)——比如 ff ()

对于其他替代方案,请查看 MDN refernce on the this keyword .

关于javascript - 如何确定 JavaScript 回调函数的执行上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com