socket.io使用for循环来添加socket.on方法

承担

socketMethods:{ update:function(data){ this.emit("test", data); console.log("socket.update"); }, test:function(data){ this.emit("test", data); console.log("socket.test"); } } 

这下面是可能的,并允许我发出“testing”和“更新”,“testing”和“更新”将被称为

 socket.on("test", function(data){ dummy.socketMethods.test.call(socket, data); }); socket.on("update", function(data){ dummy.socketMethods.update.call(socket, data); }); 

下面这些是不可能的…如果我发出“testing”或“更新”,每个人都会调用“testing”。 如果我使用FOR循环,所有方法将成为所谓的“最后一个”方法。

那就是:如果我切换更新并testing,那么testing是第一次,并且更新在socketMethods对象中是第二次。 无论我是否要求“testing”或“更新”,都会调用“更新”

 for(key in dummy.socketMethods){ socket.on(key, function(data){ dummy.socketMethods[key].call(socket, data); }); } var methods = ["test", "update"]; while(methods.length !== 0){ var method = methods.pop(); console.log(method); socket.on(method, function(data){ dummy.socketMethods[method].call(socket, data); }); } var methods = ["test", "update"]; for(var i = 0; i < methods.length; i++){ console.log(i); socket.on(methods[i], function(data){ console.log(i); dummy.socketMethods[methods[i]].call(socket, data); }); } 

CLUE:使用'i'的for循环有两个console.log。 第二个console.log返回“2”

为什么会发生? 我怎么能使用for循环来附加我的socketMethods?

假设一个闭包在创build时会“捕捉”一个外层函数variables的 ,这是常见的错误。 它不。 它“陷阱” 引用外部函数的variables,它的值将是执行闭包时外部variables的值。 如果你在一个循环中创build闭包,那么这个值将是循环结束时的值。

解决这个问题的方法是创build一个使用外部variables值作为参数的“封闭”闭包。 一种方法是创build一个帮助函数来生成闭包。 在你的第一个例子中,你可以做

 function makeOn(key) { return function(data) { dummy.socketMethods[key].call(socket, data); } } for(key in dummy.socketMethods){ socket.on(key, makeOn(key)); } 

现在在每个闭包中, key将是一个新创build的variables(闭包之间不同)设置为适当的值。

也可以使用立即函数调用(有些人称之为“自执行函数”)来简单地做同样的事情,但也不太容易理解。