for循环仅使用last属性

enj*_*ife 1 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");
Run Code Online (Sandbox Code Playgroud)

产量

black 
Graph Says 
black 
Node Says 
black 
Link Says
black 
Error Says 
black 
Info Says
Run Code Online (Sandbox Code Playgroud)

关于范围规则,我不理解什么?

Thi*_*ter 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);
}
Run Code Online (Sandbox Code Playgroud)