最近有写到nodejs,在使用遍历的时候经常会出现一个常见的错误:
var loginModule = require('loginModule')
for (var key in loginModule) {
socket.on(key, function (msg) {
loginModule[key](socket, msg);
});
})
loginModule.js的代码是:
module.exports = {
regist: function (socket, msg){
...
},
login: function (socket, msg){
...
}
}
如此执行上面的for循环后,想法是将module中的key和function都绑定起来,但是事与愿违,因为socket.on(key, fun)中的fun是一个委托,并不会在for循环中执行。
而但它执行的时候,根据js的闭包原理,它会在去拿上一层定义的key,但是这个key由于for循环的执行,已经变成了最后一个值,也就是login。
所以最终 regist其实也绑定到了login上。
理所当然的想,改成这样:
for (key in loginModule) {
var k = key
socket.on(k, function (msg) {
loginModule[k](socket, msg);
});
})
可是结果还是一样,因为这个K,也是会被多次赋值,最后取的时候,是最后一个值。
这种情况在编译语言中基本不会出现,比如我熟悉的c#~~
好吧,其实之前也多少遇到这个问题,一直不知道怎么办,网上因为问题不好描述,也一直没有查到答案~~
今天突然灵机一闪,想到了可以用一个function作为一个闭包~ 如下:
for (var key in loginModule) {
(function (){
var k = key;
socket.on(k, function (msg) {
loginModule[k](socket, msg);
});
})();
})
哈哈 完美解决~~