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
?
答案 0 :(得分:5)
虽然其他答案涉及您关于this
关键字的问题,但他们没有回答您为何使用apply
的问题。以下是踢球者:apply
未用于在该示例中设置this
关键字。相反,它被用来传递arguments
作为done
和fail
函数的参数。
举个例子:
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);
之间的区别。在第一个中,a1
,a2
和a3
分别是“红色”,“蓝色”和“绿色”。在第二个中,a1
是类似于数组的对象[ "red", "blue", "green" ]
,a2
和a3
是undefined
。
同样,在您发布的示例中,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在我了解它时帮助了我。