16

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

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

成为

deferred.done(参数).fail(参数);

AFAIK公司,当您调用函数作为某个对象的成员时,如对象函数(),函数内部已绑定到对象,因此通过调用函数是没有用的应用()只是为了约束对象相反,根据评论,这是必需的,因为之前有一些$.回调.add实施。

我的疑问不是关于jQuery,而是关于Javascript语言本身:当您调用像这样的函数时对象函数()怎么会是这样func()这个关键字未绑定对象?

4
  • 1
    这一承诺变更与您的问题有什么关系?.应用被用来传球n个另一个函数的参数数量,而不是它的上下文强制功能。 评论 2012年6月25日9:00
  • @Esailija,我想你明白了! 评论 2012年6月25日9:08
  • @克里斯托夫我想他明白了。apply()未用于强制上下文,因为已经是了正确放置(这回答了我的问题) 评论 2012年6月25日9:12
  • 使用的副作用.应用当然,它被称为.done/.fail而不是.延期所以你还需要传递正确的上下文,但这不是在这里使用它的要点。 评论 2012年6月25日9:15

5个答案5

重置为默认值
5

我的疑问不是关于jQuery,而是关于Javascript语言自身:当您调用像obj.func()这样的函数时,怎么会这样呢在func()中,this关键字未绑定到obj?

好吧,唯一可能的方法是目标函数引用a跳跃函数,那么你如何调用它就无关紧要了。在这种情况下,你如何调用函数,你是否这样做都无关紧要对象函数(),func(),函数调用({}),函数应用({})一点都不重要。然而,我不确定提交与此有何关联。

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

给出如下调用签名:对象函数(),怎么可能 对象在调用的被调用函数中?

  • 回答得很好。我想知道你是猜中了还是知道那美元。Callback.add无法处理作为数组传递的参数,如:) 评论 2012年6月25日9:19
  • @拉斐尔事实上也不是。只是这样.apply(某物、参数)是将参数传递给调用函数的唯一方法。我想你可以做点什么评估但这不算:D 评论 2012年6月25日9:21
  • 这甚至更大:)所以关键是你认出了论据构造中的关键字.apply(smth,参数)并立即将此链接到调用链接。要解决棘手的问题,通常需要对主题(经验)和横向思维:) 评论 2012年6月25日9:28
5

而其他答案则处理您关于关键词,他们不会回答你为什么应用正在使用。踢球者如下:应用未用于设置该示例中的关键字。相反,它被用来传递论据作为完成失败功能。

以这个例子为例:

var x={a: 函数(a1、a2、a3){控制台.log(a1、a2、a3);}}函数callA(){x.a.apply(x,参数);x.a(参数);}callA('red','blue','green');

如果执行此代码,您应该会看到x.a.apply(x,参数);x.a(参数);在第一个例子中,第1页,a2类、和a3类分别为“红色”、“蓝色”和“绿色”。在第二个例子中,第1页是类似阵列的对象[“红色”、“蓝色”、“绿色”]a2类a3类未定义.

同样,在您发布的示例中,应用正在用于传递论据对象,而不是设置关键字。

1
  • +对不起,这不可能被接受,但Esailija是第一个(加上他提到绑定对象)。然而,我真的很欣赏它的清晰性,并希望您的代码示例可以帮助其他人像您一样理解真正的问题:) 评论 2012年6月25日9:24
2

这只能通过引用另一个Object中的函数来实现,就像这样

obj2.func=对象.func;obj2.func();//'this现在指obj2var func2=对象.func;func2();//'this’现在指的是全局窗口对象

或者通过调用.apply()或.call()来绑定任何任意对象。

4
  • 这是对的,但没有回答我的问题:)我想知道在以下方面的区别:边界,介于a.b(参数)a.b.apply(b,参数)查看@wnwall答案 评论 2012年6月25日9:32
  • 回答你的问题:“当你调用像obj.func()这样的函数时,怎么可能在funct()中this关键字没有绑定到obj?”:-)你说的问题不在最上面的帖子中:也许你应该更新它! 评论 2012年6月25日9:36
  • 我不这么认为:P事实上,你的例子从来没有调用过函数作为的成员对象:它碰巧调用了相同的函数对象,但作为另一个对象的属性(对象2窗口). 因此是可以预测和预期的。相反,我问引擎是否在什么时候执行a.b()有可能,在里面b(),这个!=. 评论 2012年6月25日10:04
  • 啊,然后我把句子“一个像obj.func()一样的函数”中的单词“like”误解为“类似于”。。。那么你对我答案的第一部分是正确的,只有第二部分与.call()和.apply()有关:-) 评论 2012年6月25日11:05
1

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

编辑:注意,全局函数类似于窗口对象。

此QuirksMode页面在我了解这件事的时候帮助了我。

1

函数总是用接收器调用,称为函数内部,调用时给定。

当你写作时

obj.someFunc=函数(){。。。

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

如果你这么做

var aFunc=obj.someFunc;

类似的操作在很多地方都有(例如引用回调),之后

aFunc();

接收器()在这种情况下是窗户。

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

2
  • 见@Esailija并回答。你所说的是正确的,但它并没有解决这个问题,因为我明确地链接了源代码,函数实际上定义为obj.func() 评论 2012年6月25日9:14
  • 感谢您针对Esailija的回答发表评论。你完全正确。 评论 2012年6月25日9:20

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.