2013-02-13 47 views
3

我不明白許多underscore.js函數的上下文變量的用途。它的用途是什麼?我知道它在迭代器回調中綁定了「this」,但我不明白它的實際應用。_.each上下文變量

var context = {'a': 'a'}; 
_.each([1, 2, 3], function(element, index, list) 
{ 
    console.log(this); 
    console.log(element); 
    console.log(index); 
    console.log(list); 
}, context); 

回答

2

下劃線的_.each看起來是這樣的:

_.each(list, iterator, [context])

上下文是當你的迭代器是您創建的一些對象的成員非常有用,並且要在範圍內執行該功能而不是窗戶。如果您用作迭代器的預編寫函數使用this來引用對象的實例(通常情況如此),則在沒有上下文的情況下調用該函數將導致this引用錯誤的內容。

+1

上下文!=範圍。 – Bergi 2013-02-13 21:32:41

2

如果您迭代功能有點像一個方法的對象上這是非常有用:

var context = {'a': 'a', foo: function(x) { console.log(this.a + x); }}; 
_.each([1, 2, 3], context.foo, context); 
+0

這是最容易理解的答案。也可能會注意到,如果您傳遞的是像原始海報那樣的匿名函數,則上下文是不必要的。 – OCDev 2015-05-07 08:19:50

0

這是當你不需要背景改變,不要忘記它真的有幫助很難dependecy兄弟骨幹。

var Collection = Backbone.Collection.extend({ 
//.. 
    _toggleActive: function (model, state) { 
     model.set({ 
      active: state 
     }); 
    }, 
    deactivateAll: function() { 
     // analog _.each(this.models , func, [context]) 
     this.each(function (model) { 
      // call the method of collection from context 
      this._toggleActive(model, false); 
     }, this); 
    } 
//.. 
}); 

或者只是爲了調試

_.each([1,2,3], function(item, i, arr){ 
    this.log(item, i); 
}, console); 
+1

對於顯示調試的代碼,爲什麼你需要控制檯的上下文? – 2013-02-14 13:04:54

+0

是的,你說得對,改爲必要的背景下的事情,但贏得的比較低) – Flops 2013-02-14 13:29:50

0

由於版本有下劃線中約21函數接受「語境」作爲最後一個可選參數。

_.each(列表,iteratee(元件,索引,目錄),[上下文])

在迭代元素的列表,得到各依次的iteratee功能。迭代器綁定到上下文對象,如果通過。

var array_1 = ['asdf', 'ghjk', 'lzxc', 'vbnm', 'qwer', 'tyui', 'op']; 
var array_2 = [1,0,2,9,3,8,4,7,5,6]; 

_.each(array_1, function(element, index, list){ 
    console.log(this.length - index + " - " + this[this.length - index]); 
}, array_2); 

將輸出

1 - asdf 
0 - ghjk 
2 - lzxc 
9 - vbnm 
3 - qwer 
8 - tyui 
4 - op 

這裏,這是對應於上下文陣列array_2。