繁体   English   中英

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

[英]How do I determine the Execution Context for a JavaScript callback function?

将函数作为对象属性调用时, 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并转换为全局上下文(除非严格模式,或者在执行之前作为一个方法附加到一个新对象上),但我不愿意依赖它而不是一个猜测。

如何将函数作为回调传递时设置执行上下文

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

任何作为参数传递的函数在将其分配给局部变量时都会替换其先前的执行上下文

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

执行上下文仅在调用函数创建。 和调用的函数仅是如何确定的执行上下文的性质,例如它的this值。

例如,

将函数作为对象属性调用时, this其设置为父对象。

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

或者,当一个函数被调用为普通函数时, this被设置为undefined (或者在sloppy模式下的全局对象) - 例如ff()

对于其他替代方案,请查看this关键字MDN引用

对于规则this在回调是相同的非方法函数的规则。 真正重要的是,如果函数调用看起来像f() (非方法), xf() (方法调用)或new f() (构造函数)

任何人都可以帮助我理解为什么回调是在全局上下文中而不是在父对象的上下文中执行的?

可悲的是,这是我们必须忍受的那些大Javascript疣之一。 也就是说,如果你在严格模式下运行,那么thisnull而不是全局对象,这更加理智。 另外,在ES6会有“胖箭头” => lambda表达式 ,其继承this从它们的上下文词法(这意味着它得到其this从外功能,就像普通的变量)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM