iNk*_*iNk 1 javascript sockets node.js socket.io
假设
socketMethods:{
update:function(data){
this.emit("test", data);
console.log("socket.update");
},
test:function(data){
this.emit("test", data);
console.log("socket.test");
}
}
Run Code Online (Sandbox Code Playgroud)
以下是可能的,并且允许我发出"test"和"update",并且将调用"test"和"update"
socket.on("test", function(data){
dummy.socketMethods.test.call(socket, data);
});
socket.on("update", function(data){
dummy.socketMethods.update.call(socket, data);
});
Run Code Online (Sandbox Code Playgroud)
以下这些是不可能的......如果我发出"test"或"update",每个人都会调用"test".如果我使用FOR循环,所有方法都将成为调用的"最后"方法.
那就是:如果我切换更新并测试以便测试是第一个,并且更新是socketMethods对象中的第二个.无论我是否要求"测试"或"更新",都会始终调用"更新"
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);
});
}
Run Code Online (Sandbox Code Playgroud)
CLUE:使用'i'的for循环有两个console.logs.第二个console.log返回"2"
为什么会这样?我怎么能用for循环来连接我的socketMethods?
你犯了一个常见的错误,就是假设一个闭包在创建外部函数的变量时"捕获"它的值.它没有.它"捕获" 对外部函数变量的引用,其值将是外部变量在执行闭包时所具有的值.如果你在循环中创建闭包,那么该值将是它在循环结束时的任何值.
解决这个问题的方法是创建一个"封闭"闭包,它使用外部变量的值作为参数.一种方法是创建一个生成闭包的辅助函数.在你的第一个例子中,你可以做到
function makeOn(key) {
return function(data) {
dummy.socketMethods[key].call(socket, data);
}
}
for(key in dummy.socketMethods){
socket.on(key, makeOn(key));
}
Run Code Online (Sandbox Code Playgroud)
现在在每个闭包中,key将一个新创建的变量(不同的闭包)设置为适当的值.
也可以使用立即函数调用(有些人称之为"自执行函数")来更简洁地执行相同的操作,但也可能稍微不那么可读.
| 归档时间: |
|
| 查看次数: |
1032 次 |
| 最近记录: |