理解里面的用法

understanding the usage of this inside

本文关键字:用法      更新时间:2023-09-26

我正在浏览$。在jQuery中有所不同,遇到了以下示例:

$.fn.bindOnce = function( event, callback ) {
    var element = $( this[ 0 ] ),
        defer = element.data( "bind_once_defer_" + event );
    if ( !defer ) {
        defer = $.Deferred();
        function deferCallback() {
            element.unbind( event, deferCallback );
            defer.resolveWith( this, arguments ); // What is `this` and `arguments` here ?  
        }
        element.bind( event, deferCallback )
        element.data( "bind_once_defer_" + event , defer );
    }
    return defer.done( callback ).promise();
};

你可以看到同样的例子这里,现在的代码不是太复杂,但有一些东西不是很有意义,例子,看看下面的代码片段:

function deferCallback() {
            element.unbind( event, deferCallback );
            defer.resolveWith( this, arguments );
        }

代码是相当标准的,我不明白的是什么是this指向上面的代码?我没有线索,这是在上面的代码指向什么。

文档也没有详细说明这个方法。谁能解释一下?我明白这是上下文,但我不明白的是,在我上面提到的代码片段中,这将指向什么?

我也不明白在上面的代码片段中resolveWith是什么部分。我唯一的猜测是resolveWith()会导致执行下面这行代码:

return defer.done( callback ).promise();

我对此也不太确定。

无法理解上面的代码片段中resolveWith的作用代码。


链接页

代码的工作方式如下:

  • 检查元素是否已经为给定附加了deferred事件

  • 如果没有,创建它并使它在事件发生时被解决第一次开火

  • 然后将给定的回调附加到延迟的回调并返回承诺


.resolveWith()可以在.done(), .fail(), .notify()回调中设置context, this

这将指向什么?

我相信他们打算让this关键字指向$.fn.bindOnce链接的元素,但它在一个不具有相同作用域的新函数中被引用。

你可以告诉deferCallback它的this应该是什么,尽管.bind():

// use `.bind()` to set the `this` keyword in
// deferCallback to the `this` in bindOnce 
element.bind( event, deferCallback.bind(this) );

目前,没有.bind(), this将是window