16

在这个提交中有一个我无法解释的变化

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

4

5 回答 5

5

虽然其他答案处理您关于this关键字的问题,但它们并没有回答您关于为什么apply要使用的问题。这是踢球者:在该示例apply中未用于设置this关键字。相反,它被用来arguments作为doneandfail函数的参数传递。

举个例子:

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);。在第一个中a1a2、 和a3是各自的颜色“红色”、“蓝色”和“绿色”。在第二个中,a1是一个类似数组的对象[ "red", "blue", "green" ]a2并且a3undefined

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

于 2012-06-25T09:08:39.447 回答
5

我怀疑的不是 jQuery,而是 Javascript 语言本身:当你调用像 obj.func() 这样的函数时,怎么会在 func() 内部 this 关键字没有绑定到 obj?

好吧,唯一可能的方法是如果obj.func引用一个bound函数,那么你如何调用它并不重要。在这种情况下,如何调用函数并不重要,是否调用obj.func(), func(), func.call({}),func.apply({})根本不重要。但是,我不确定提交与此有何关系。

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

给定这样的调用签名:obj.func(),怎么可能不在this调用的被调用函数内? obj

于 2012-06-25T09:09:00.683 回答
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到任意对象。

于 2012-06-25T08:51:48.683 回答
1

函数总是用接收器调用this,在函数内部调用,在调用时给出。

当你写作

obj.someFunc = function() {...

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

如果你这样做

var aFunc = obj.someFunc;

喜欢在很多地方完成(例如引用回调),然后

 aFunc();

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

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

于 2012-06-25T08:54:28.477 回答
1

我使用的简写版本是,this在 JavaScript 中总是指当前执行的函数是其方法的对象——除非在方法是回调的特殊情况下,当this指的是回调绑定到的对象(例如一个按钮)。

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

这个 QuirksMode 页面在我学习它时帮助了我。

于 2012-06-25T08:57:00.563 回答