当使用“for in”循环设置方法时,会设置正确的方法名称,但每个函数调用中使用的变量都会被最后一个set属性破坏。
示例代码
function colorLog() {
var color = {
graph: '#88A825',
node: '#35203B',
link: '#911146',
error: '#AC2930',
info: 'black'
};
var logger = {};
for(var k in color) {
logger[k] = function(msg) {
console.log(color[k]);
console.log("%c" + msg, "color:" + color[k] + ";font-weight:bold;");
}
}
return logger;
}
var log = colorLog();
log.graph("Graph Says");
log.node("Node Says");
log.link("Link Says");
log.error("Error Says");
log.info("Info Says");
输出
black
Graph Says
black
Node Says
black
Link Says
black
Error Says
black
Info Says
我不了解范围界定规则?
答案 0 :(得分:5)
每个闭包都获得相同的k
,因此在定义了所有函数后,它指向color
的最后一个键。解决它的最简单方法是使用自执行函数创建一个新的:
for(var k in color) {
logger[k] = (function(k) {
return function(msg) {
console.log(color[k]);
console.log("%c" + msg, "color:" + color[k] + ";font-weight:bold;");
};
})(k);
}