我在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()调用,这意味着它不被称为方法,因此这是全局对象”。
通过实际名称调用函数和回调()之间有什么区别,如源代码所示?
当test2中的console.log(this)在archive.action ???
中时,它如何指向Window答案 0 :(得分:10)
在JavaScript中,您可以使用4种不同的调用模式调用函数:
模式主要在于this
参数的初始化方式不同。
当您使用oArchive.action.test2()
时,您将使用方法模式调用test2()
函数,在这种情况下,this
将绑定到action
对象。只要调用表达式包含细化(即.
点表达式或[subscript]
表达式),JavaScript就会使用方法模式。
另一方面,当函数不是对象的属性时,则使用函数模式调用它。在这种情况下,this
参数绑定到全局对象,实际上这就是JavaScript调用callback()
函数的方式。
Douglas Crockford在他的Good Parts book中,将此描述为语言设计中的错误,并提出了一些可行的解决方法。在您的情况下,一个简单的解决方法是使用call()
或apply()
作为Tim Down suggested in your previous question调用回调:
callback.call(this);
这是有效的,因为应用/调用调用模式允许您选择this
的值,这是您需要的。
答案 1 :(得分:3)
在javascript中,this
关键字设置为函数的所有者。函数对象本身并不维护其所有权,而是从我们调用函数的方式推断出所有权。
例如:
var foo = function() {
alert('hello');
};
var abc = {};
abc.bar = foo;
简单地调用类似
的功能foo();
让解释器不知道该函数可能附加到哪个对象。它可以附加到多个对象,它可以是变量等。因此解释器将this
设置为全局对象。
但是,当调用像
这样的函数时abc.bar();
解释器知道该函数已附加到abc
对象,因此this
设置为abc
。即使bar
和foo
都引用相同的函数对象,调用模式的差异也会导致this
表现不同。