理解“这个”关键词
Understanding "this" keyword
在此提交中,有一个我无法解释的更改
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
约束?
我的疑问不是关于jQuery,而是关于Javascript语言。 本身:当你调用像obj.func()这样的函数时,它怎么可能 在 func() 中,这个关键字没有绑定到 obj?
好吧,唯一可能的方法是,如果obj.func
引用bound
函数,那么如何调用它并不重要。在这种情况下,你如何调用函数并不重要,无论你是否执行obj.func()
、func()
、func.call({})
、func.apply({})
都无关紧要。但是,我不确定提交与此有何关系。
为了澄清,我回答引用的问题解释为:
给定一个调用签名,例如:obj.func()
,this
怎么可能不在调用的被调用函数中obj
?
虽然其他答案处理您关于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
关键字。
这只能通过从另一个对象引用函数来实现,如下所示
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
绑定到任何任意对象。
我使用的速记版本是 JavaScript 中的 this
总是引用当前执行函数是方法的对象 - 除非在特殊情况下,当该方法是回调时,当this
引用回调绑定的对象(例如按钮)时。
编辑:请注意,全局函数类似于window
对象的方法。
这个QuirksMode页面在我学习它时帮助了我。
函数总是用一个接收器调用,在函数内部称为this
,在调用时给出。
当你在写作时
obj.someFunc = function() {...
你并不是说 someFunc 必须作为接收方 obj,你只是说 obj 有一个名为 someFunc 的属性,其值是一个函数。
如果你这样做
var aFunc = obj.someFunc;
就像在许多地方所做的那样(例如引用回调),之后
aFunc();
接收器(this
)在本例中是窗口。
这是因为在javascript中,与java等语言相反,函数是"第一类"对象,特别是你可以将它们作为值传递,并且不绑定到唯一的预先指定的接收器。
- 如何调用这个匿名 JavaScript 函数
- 使用“;这个“;JavaScript原型方法中的关键字
- 我需要为我的朋友在这个项目上提供帮助
- 为什么在这个网站上不能通过JS访问元素
- 模块模式和这个
- 你能解释一下这个阶乘函数是如何工作的吗?
- 为什么indexOf在这个js代码中不起作用
- Steam Web API:I'我不知道该如何处理这个看起来像哈希的url来生成图像
- 这个条件语句的逻辑有问题
- 为什么不是'这个jQuery汉堡包按钮不工作
- 如何向这个javascript/jquery函数添加参数
- 为什么获胜'这个半圆长不大
- 这个问号在Flow中意味着什么:“;?()=>“无效”;
- 为什么我在这个javaScript代码中使用NaN
- 你能解释一下为什么这个javascript不正确吗
- KeyPress和Keydown在这个特定的代码上不起作用.只有key-up起作用
- 如何正确地使这个js片段内容不可知
- 如何从函数内部的这个变量中获取值
- 理解“这个”关键词
- 我怎么能称呼“上层阶级”这个关键词