我在 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/