7

我问了一个关于Javascript this 指向 Window 对象的问题,关于“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?

4

2 回答 2

11

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

  • 函数调用
  • 方法调用
  • 应用/调用调用
  • 构造调用

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

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

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

Douglas Crockford在他的Good Parts 书中将其描述为语言设计中的一个错误,并提出了一些可能的解决方法。在您的情况下,一个简单的解决方法是使用call()or调用回调apply(),正如Tim Down 在上一个问题中建议的那样

callback.call(this);

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

于 2010-05-02T03:13:16.683 回答
4

在 javascript 中,this关键字设置为函数的所有者。函数对象本身并不维护它们的所有权,而是从我们调用函数的方式推导出所有权。

例如:

var foo = function() {
    alert('hello');
};
var abc = {};
abc.bar = foo;

只需调用函数

foo();

让解释器不知道函数可能附加到什么对象。它可能附加到多个对象,可能是变量等。因此解释器设置this为全局对象。

但是,当调用类似的函数时

abc.bar();

解释器知道函数附加到abc对象,因此this设置为abc. 即使两者都bar引用foo同一个函数对象,调用模式的差异也会导致this行为不同。

于 2010-05-02T03:24:52.853 回答