Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “理解”;这";关键词_Javascript_Jquery - Fatal编程技术网

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()这样的函数时