2014-09-02 53 views
0

我想了解underscore.js防抖動功能的機制: http://underscorejs.org/#debounce內在功能方面

下面是它的原生代碼:

_.debounce = function(func, wait, immediate) { 
    var timeout, args, context, timestamp, result; 

    var later = function() { 
     var last = _.now() - timestamp; 

     if (last < wait && last > 0) { 
     timeout = setTimeout(later, wait - last); 
     } else { 
     timeout = null; 
     if (!immediate) { 
      result = func.apply(context, args); 
      if (!timeout) context = args = null; 
     } 
     } 
    }; 

    return function() { 
     context = this; 
     args = arguments; 
     timestamp = _.now(); 
     var callNow = immediate && !timeout; 
     if (!timeout) timeout = setTimeout(later, wait); 
     if (callNow) { 
     result = func.apply(context, args); 
     context = args = null; 
     } 

     return result; 
    }; 
    }; 

事情我被困with是內部可返回函數中使用的上下文變量。我不明白爲什麼我們應該在這裏使用它以及它包含什麼上下文。 我試圖使用相同的功能與簡單的調用debounced函數沒有應用任何上下文,它也運作良好。 這裏是我的小提琴與這兩個功能: http://jsfiddle.net/vlrt/fby9dhe0/11/

那麼,這裏是必要的背景?需要應用什麼背景?

回答

1

上下文是this與函數的去抖動版本被調用。如果我們在一個對象上刪除一個方法,那麼我們將用object.debounced_function來調用它,但我們希望用與this相同的對象調用原始函數。

如果去抖功能不是一個對象的方法,或者在調用時沒有this,則前後文爲空或window什麼的,和原來的功能將與被稱爲this,但沒有人會在乎。

我假設您瞭解Function#apply方法,該方法調用具有特定上下文(this)和參數集的函數。

+0

@torazuburo,非常感謝。在我測試這個功能的時候,我只關注全局函數的去除,並且把其他用例排除在外。現在我明白,如果我們想要刪除一個obect方法,那麼上下文對於綁定對象是必要的。否則,該函數將始終採用窗口對象上下文。 這裏是下劃線功能,附加參數關閉上下文。如果這是真的,全局變量將被採取增加,儘管對象具有相關屬性。 http://jsfiddle.net/vlrt/fby9dhe0/13/ – rumirumi 2014-09-03 11:03:22