Javascript underscore.js-我必须使用上下文参数和'this'吗?

问题描述:

在教程中,我看着下划线这段代码是用来证明_.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

就像在评论中提到的那样,这不是必须的,但它在某些情况下可能有用。它还使迭代器功能不知道上面的范围。它只知道它处理的是具有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);