2015-07-12 53 views
0

我正要通過$ .Deffered 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(); 
}; 

你可以看到同樣的例子HERE,現在的代碼是不是過於複雜,但也有幾件事情,不太有意義,例如,看到的代碼下面的代碼片段:

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

代碼是非常標準的,我不明白,雖然是什麼是this指向上面的代碼?我不知道這是指向在上面的代碼。

documentation對此方法也沒有多說。

有人能解釋嗎?我明白這是上下文,但我不明白的是,在上面提到的代碼片段中,這將指向什麼?

另外我不明白什麼部分resolveWith在上面的代碼片段中扮演反正。我唯一的猜測是,resolveWith()結果在下面的一行代碼的執行:

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

再次我也不太清楚這件事。

回答

1

無法理解什麼部分resolveWith在上面的代碼片段 反正。


linked page

代碼工作如下:

  • 檢查是否已具有一定的推遲連接爲給定 事件

  • 如果不是元素,創建並創建它,以便在事件爲時解決解僱各地

  • 第一次那麼給回調連接到遞延並返回承諾


.resolveWith()可以設置contextthis.done().fail().notify()回調

1

這會指向什麼?

我相信他們已經打算爲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()thiswindow