了解"this"关键字

Raf*_*ele 16 javascript jquery

在这个提交中,有一个我无法解释的变化

deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
Run Code Online (Sandbox Code Playgroud)

deferred.done( arguments ).fail( arguments );
Run Code Online (Sandbox Code Playgroud)

据我所知,当你调用一个函数作为某些对象的成员一样obj.func(),里面的功能this势必会obj,所以就没有使用通过调用函数apply()只是为了绑定thisobj.相反,根据评论,这是必要的,因为前面的一些$.Callbacks.add实现.

我怀疑是不是jQuery的,但关于JavaScript语言本身:当你调用一个函数一样obj.func(),怎么能是这里面func()this关键词不绑定obj

Nat*_*all 5

虽然其他答案涉及您关于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');
Run Code Online (Sandbox Code Playgroud)

如果执行此代码,你应该看到的区别x.a.apply(x, arguments);x.a(arguments);.在第一个a1,a2a3是各自的颜色"红","蓝"和"绿".在第二个,a1是阵列状物体[ "red", "blue", "green" ]a2a3undefined.

同样,在您发布的示例中,apply正在用于arguments正确传递对象,而不是设置this关键字.


Esa*_*ija 5

我的疑问不是关于jQuery,而是关于Javascript语言本身:当你调用像obj.func()这样的函数时,如何在func()里面将this关键字绑定到obj?

嗯,这是可能的唯一方法是如果obj.func引用一个bound函数,那么你如何调用它并不重要.在这种情况下,它不会不管你如何调用该函数,不管你做的obj.func(),func(),func.call({}),func.apply({})无所谓的.但是,我不确定提交是如何与此相关的.

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

给定一个调用签名,如:obj.func(),怎么可能说this不是 obj呼叫被调用的函数里面?