2015-06-20 76 views
1

在教程中,我看着下劃線這段代碼是用來證明_.eachJavascript underscore.js-我必須使用上下文參數和'this'嗎?

var people = { 
    names: ['Craig', 'John', 'Dan', 'Elijah'], 
    getMessage: function(name) { 
     return 'Hello there, ' + name + '!'; 
    } 
}; 

_.each(people.names, function(element, index, list) { 
    console.log(this.getMessage(element)) 
}, people); 

它解釋說,people被作爲綁定thispeople對象的上下文爲_.each呼叫通過,但我不不明白爲什麼這是必要的。在迭代器函數體內我不能明確寫出people.getMessage

,如:

_.each(people.names, function(element, index, list) { 
    console.log(people.getMessage(element)); 
}); 

爲什麼使用this並在上下文傳遞呢?

+4

因爲那麼函數可以推廣到適用於任何對象而不是一個特定的對象。 –

+1

_爲什麼這是必要的_這是不必要的,但非常有用 – hindmost

+1

「上下文」是一個濫用JavaScript的術語。將「*作爲*的上下文」替換爲「to」,也許它更有意義。說「*人*被分配給函數的* this *」也是更正確的,因爲這會發生。 – RobG

回答

1

就像在評論中提到的那樣,這不是必須的,但它在某些情況下可能有用。它還使迭代器功能不知道上面的範圍。它只知道它處理的是具有getMessage()方法的對象,並且沒有鏈接到閉包中的特定變量。

我能想到的一個例子是能夠重複使用那些具有相同結構類型但不在範圍內命名爲people的不同對象。

var people = { 
    names: ['Craig', 'John', 'Dan', 'Elijah'], 
    getMessage: function(name) { 
     return 'Hello there, ' + name + '!'; 
    } 
}; 

var dogs = { 
    names: ['Jimmy', 'Rufus', 'Woofie', 'Silly'], 
    getMessage: function(name) { 
     return 'Woof there, ' + name + '!'; 
    } 
}; 

function logTheMessage(element) { 
    console.log(this.getMessage(element)); 
} 

_.each(people.names, logTheMessage, people); 
_.each(people.names, logTheMessage, dogs); 
相關問題