我刚刚浏览了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();
我再也不确定这一点。
答案 0 :(得分:1)
无法理解在上面的片段中播放哪些部分resolveWith 代码无论如何。
代码的工作原理如下:
检查元素是否已为给定的附加延迟 事件
如果没有,请创建并创建它,以便在事件发生时解析它 第一次围绕
然后将给定的回调附加到延期并返回承诺
.resolveWith()
可以在context
,this
.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
。