理解“这个”关键词

Understanding "this" keyword

本文关键字:关键词 这个 理解      更新时间:2023-09-26

在此提交中,有一个我无法解释的更改

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作为donefail函数的参数。

举个例子:

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);之间的区别。在第一个中,a1a2a3分别是"红色"、"蓝色"和"绿色"。在第二个中,a1是一个类似数组的对象,[ "red", "blue", "green" ]a2a3 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等语言相反,函数是"第一类"对象,特别是你可以将它们作为值传递,并且不绑定到唯一的预先指定的接收器。