了解“this”关键字

时间:2012-06-25 08:48:07

标签: javascript jquery

In this commit有一个我无法解释的变化

deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );

变为

deferred.done( arguments ).fail( arguments );

AFAIK,当您将某个函数作为obj.func()之类的对象的成员调用时,函数this内部绑定到obj,因此没有用处通过apply()调用函数只是为了将this绑定到obj。相反,根据评论,这是必需的,因为前面的$.Callbacks.add实现了一些。

我的疑问不是关于jQuery,而是关于Javascript语言本身:当你调用像obj.func()这样的函数时,func() this关键字内部如何?没有约束obj

5 个答案:

答案 0 :(得分:5)

虽然其他答案涉及您关于this关键字的问题,但他们没有回答您为何使用apply的问题。以下是踢球者:apply未用于在该示例中设置this关键字。相反,它被用来传递arguments作为donefail函数的参数。

举个例子:

var x = {
    a: function(a1, a2, a3) {
        console.log(a1, a2, a3);
    }
}

function callA() {
    x.a.apply(x, arguments);
    x.a(arguments);
}

callA('red', 'blue', 'green');

如果您执行此代码,您应该会看到x.a.apply(x, arguments);x.a(arguments);之间的区别。在第一个中,a1a2a3分别是“红色”,“蓝色”和“绿色”。在第二个中,a1是类似于数组的对象[ "red", "blue", "green" ]a2a3undefined

同样,在您发布的示例中,apply用于正确传递arguments对象,而不是设置this关键字。

答案 1 :(得分:5)

  

我的疑问不是关于jQuery,而是关于Javascript语言   本身:当你调用像obj.func()这样的函数时,它是怎么回事   在func()里面,this关键字没有绑定到obj?

嗯,唯一可行的方法是obj.func引用bound函数,然后调用它并不重要。在这种情况下,无论您如何调用该函数,无论您是obj.func()func()func.call({})func.apply({})都无关紧要。但是,我不确定提交是如何与此相关的。

为了澄清,我正在回答引用的问题,解释为:

如果有obj.func()这样的通话签名,那么在调用的被调用函数中,this 不是 obj怎么可能?

答案 2 :(得分:2)

只有通过引用其他对象中的函数才能实现这一点

obj2.func = obj.func;
obj2.func(); // 'this' now refers to obj2

var func2 = obj.func;
func2(); // 'this' now refers to the global window object

或通过调用.apply()或.call()将this绑定到任意对象。

答案 3 :(得分:1)

函数总是在函数内部使用一个名为this的接收器调用,该函数在调用时给出。

当你写作时

obj.someFunc = function() {...

你并不是说someFunc必须有接收器obj,你只是说obj有一个名为someFunc的属性,其值是一个函数。

如果你这样做

var aFunc = obj.someFunc;

就像在许多地方(例如回调的引用)和之后

那样
 aFunc();

接收者(this)在这种情况下是窗口。

这是因为javascript中的函数与java之类的语言相反,是“第一类”对象,特别是指您可以将它们作为值传递,而不是绑定到唯一的预定义接收器。

答案 4 :(得分:1)

我使用的简写版本是JavaScript中的this始终引用当前正在执行的函数是一个方法的对象 - 除了在方法是回调的特殊情况下,{{1}时}指的是回调绑定到的对象(例如按钮)。

编辑:请注意,全局函数就像this对象的方法。

This QuirksMode page在我了解它时帮助了我。