javascript“this”再次指向Window对象

时间:2010-05-02 02:52:01

标签: 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()调用,这意味着它不被称为方法,因此这是全局对象”。

通过实际名称调用函数和回调()之间有什么区别,如源代码所示?

当test2中的console.log(this)在archive.action ???

中时,它如何指向Window

2 个答案:

答案 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。即使barfoo都引用相同的函数对象,调用模式的差异也会导致this表现不同。