for循环仅使用last属性

时间:2014-09-26 18:01:40

标签: javascript

当使用“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

我不了解范围界定规则?

1 个答案:

答案 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);
}