了解这个内部的用法

时间:2015-07-12 14:26:46

标签: javascript jquery promise

我刚刚浏览了jQuery中$ .Deffered的文档,并遇到了以下示例:

$.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();
};

您可以看到相同的示例 HERE ,现在代码并不过分复杂,但有一些事情没有多大意义,例如,请参阅下面的代码段代码:

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

代码非常标准,我不明白的是this在上面的代码中指向的是什么?我不知道在上面的代码中指出了什么。

documentation 也没有多说这个方法。

任何人都可以解释一下吗?我明白这是上下文,但我不明白的是,在我上面提到的代码片段中,这将指向什么?

另外,我无法理解上面代码片段中解析的部分是什么。我唯一的猜测是resolveWith()导致执行下面的代码行:

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

我再也不确定这一点。

2 个答案:

答案 0 :(得分:1)

  

无法理解在上面的片段中播放哪些部分resolveWith   代码无论如何。

linked page

代码的工作原理如下:

  • 检查元素是否已为给定的附加延迟 事件

  • 如果没有,请创建并创建它,以便在事件发生时解析它 第一次围绕

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

.resolveWith()可以在contextthis .done()回调中设置.fail().notify()

答案 1 :(得分:1)

  

这将指向什么?

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

你可以通过this告诉deferCallback .bind()应该是什么:

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

目前,如果没有.bind(),则this将为window