javascript"this"再次指向Window对象

Moo*_*oon 6 javascript reference function-call

我问了一个关于Javascript的问题,这指向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); 
Run Code Online (Sandbox Code Playgroud)

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

通过实际名称调用函数和源代码中显示的callback()之间有什么区别?

当test2中的console.log(this)指向Window时,它是如何指向Window的.

Dan*_*llo 10

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

  • 函数调用
  • 方法调用
  • 应用/调用调用
  • 施工调用

模式主要在this参数初始化方式上有所不同.

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

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

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

callback.call(this);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为Apply/Call调用模式允许您选择所需的值this.