Javascript “理解”;这";关键词
有一个变化我无法解释Javascript “理解”;这";关键词,javascript,jquery,Javascript,Jquery,有一个变化我无法解释 deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); 变成 deferred.done( arguments ).fail( arguments ); ,当您作为某个对象(如obj.func())的成员调用函数时,在函数内部此绑定到obj,因此通过apply()调用函数将没有用,只需将此绑定到obj。相反,根据评论,这是必需的,因为前面有一些$.Callbacks.ad
deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
变成
deferred.done( arguments ).fail( arguments );
,当您作为某个对象(如obj.func()
)的成员调用函数时,在函数内部此
绑定到obj
,因此通过apply()
调用函数将没有用,只需将此绑定到obj
。相反,根据评论,这是必需的,因为前面有一些$.Callbacks.add
实现
我的怀疑不是关于jQuery,而是关于Javascript语言本身:当您调用像obj.func()
这样的函数时,怎么可能在func()
内部这个关键字没有绑定到obj
?只有从另一个对象这样引用函数才能实现
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
绑定到任意对象。函数总是由一个接收器调用,该接收器在函数内部称为this
,调用时给出
当你写作的时候
obj.someFunc = function() {...
你不是说someFunc必须有作为接收者的obj,你只是说obj有一个名为someFunc的属性,它的值是一个函数
如果你这样做
var aFunc = obj.someFunc;
在许多地方(例如引用回调)和之后都会执行类似操作
aFunc();
接收器(此
)在本例中是窗口
这是因为javascript中的函数与java等语言相反,是“第一类”对象,这特别意味着,您可以将它们作为值传递,而不必绑定到唯一的预先指定的接收器。我使用的简写版本是,在JavaScript中,这个
总是指当前执行的函数是一个方法的对象——除非在方法是回调的特殊情况下,当此
指回调绑定到的对象(例如按钮)
编辑:请注意,全局函数类似于窗口
对象的方法
在我学习时帮助了我。其他答案处理了你关于这个
关键字的问题,但没有回答你为什么要使用apply
的问题。下面是提示:apply
在该示例中未用于设置this
关键字。相反,它被用来传递参数
作为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,参数)之间的差异代码>和x.a(参数)代码>。在第一种颜色中,a1
、a2
和a3
分别是“红色”、“蓝色”和“绿色”。在第二个中,a1
是一个类似数组的对象[“红色”、“蓝色”、“绿色”]
,a2
和a3
是未定义的
同样,在您发布的示例中,apply
用于正确传递参数
对象,而不是设置this
关键字
我怀疑的不是jQuery,而是Javascript语言
本身:当您调用像obj.func()这样的函数时,它怎么会这样呢
在func()中,this关键字未绑定到obj
唯一可行的方法是,如果obj.func
引用一个函数,那么不管你如何调用它。在这种情况下,如何调用函数无关紧要,无论您是否执行obj.func()
,func()
,func.call({})
,func.apply({})
,都无关紧要。不过,我不确定提交与此有何关系
为了澄清,我回答的问题被解释为:
给定一个调用签名,如:obj.func()
,该调用函数中的this
怎么可能不是obj
.apply
用于将n
数量的参数传递给另一个函数,而不是它的上下文强制功能。@Esailija,我想你说到点子上了@克里斯托夫,我想他说到点子上了。apply()没有用于强制上下文,因为它已经正确放置(这回答了我的问题)当然,使用.apply
的副作用是,它被称为.done/.fail
的属性,而不是.deferred
,因此您还需要传递正确的上下文,但这不是此处使用它的要点。请参阅@Esailija和答案。您所说的是正确的,但它并没有解决这个问题,因为我明确地链接了源代码,并且函数实际上是明确的obj.func(),感谢您对Esailija的答案的评论。你完全正确,回答得很好。我想知道您是否只是猜测,或者您是否知道$.Callbacks.add不能处理作为数组传递的参数,例如:)@Raffaele事实上也不能。只是.apply(something,arguments)
是传递参数的唯一方法,与传递给调用函数的参数完全相同。好吧,我想你可以用eval
做些什么,但这不算:数据这更重要:)所以关键是你识别了构造中的arguments关键字。apply(smth,arguments)并立即将其链接到调用链接。通常,要解决棘手的问题,需要对主题(经验)和横向思维有深入的了解:)+1,很抱歉,这不是公认的答案,但Esailija是第一个(加上他提到的绑定对象)。然而,我真的很欣赏它的清晰性,并希望您的代码示例能够像您一样帮助其他人理解真正的问题:)这是正确的,但并没有回答我的问题:)我想知道a.b(args)和a.b.apply(b,args)之间的区别。请参见@wnwall answer我确实回答了您的问题:“当调用像obj.func()这样的函数时