javascript "this"再次指向 Window 对象

标签 javascript reference function-call

我在 Javascript this points to Window object 上问了一个问题关于“this”指向 Window 对象。

这里是源代码

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
        callback(); 
    }, 
    test2: function(){ 
        console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

Tim Down 写道“但是该函数随后使用 callback() 调用,这意味着它不作为方法调用,因此这是全局对象”。

按实际名称调用函数与按源代码所示的 callback() 调用函数有什么区别?

test2中的console.log(this)在archive.action中是如何指向Window的???

最佳答案

在 JavaScript 中,您可以使用 4 种不同的调用模式调用函数:

  • 函数调用
  • 方法调用
  • 申请/调用调用
  • 构造调用

模式的主要区别在于 this 参数的初始化方式。

当您使用 oArchive.action.test2() 时,您将使用方法模式调用 test2() 函数,在这种情况下 this 将绑定(bind)到 action 对象。只要调用表达式包含细化(即 . 点表达式或 [subscript] 表达式),JavaScript 就会使用方法模式。

另一方面,当函数不是对象的属性时,则使用函数模式调用它。在这种情况下,this 参数绑定(bind)到全局对象,实际上这就是 JavaScript 调用您的 callback() 函数的方式。

Douglas Crockford在他的 Good Parts book ,将此描述为语言设计中的错误,并提出了一些可能的解决方法。在您的情况下,一种简单的解决方法是使用 call()apply() 调用回调,如 Tim Down suggested in your previous question :

callback.call(this);

之所以可行,是因为 Apply/Call 调用模式允许您选择 this 的值,这正是您所需要的。

关于javascript "this"再次指向 Window 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752291/

相关文章:

perl - 使用 for/foreach 访问数组引用数组的正确语法是什么

c++ - 传递对 QPixmap ctor 的引用

c++ - 从基调用非虚拟成员函数

arrays - 在不定义变量的情况下将数组作为函数参数传递

c - 为什么我的用户定义函数重复两次?

javascript - 为无框窗口添加边框 - Electron

javascript - Div 字段未更新

javascript - 替换文本后如何使空间必须保持不变?

javascript - 如何在Jquery中缩放div内容?

php - 使用动态键字符串检索对象变量