可能重复:
Javascript closure inside loops - simple practical example添加成员动态反对
我试图做这样的事情:
var obj = function(){
var members = ['a','b','c','d','e'];
for(var i in members){
inst[i] = function(){
console.log(i);
}
}
};
但是当我做:
var inst = new obj();
inst.a(); inst.b(); inst.c(); inst.d(); inst.e();
它打印出5次!另外,我可能会引用this
,而不是使用我实例化对象的名称,但我无法完成这项工作。这背后的逻辑是使用websockets来生成一个API模板客户端。这是一个粗略的演示,它基本上做了相同类型的事情(逻辑上),但是我陷入了这个技术问题,并且阻碍了我的进步。
感谢
编辑
让我给完整的问题。我不想超载每个人,但这些解决方案不工作...
var SocketClient = function(config){
//platform specific stuff
var self = this;
var count = 0;
var socket = io.connect(config.address+':'+config.port);
var members = [];
socket.on('method',function(data){
console.log(data.name);
KovarApp.client[data.name] = addLogicMember(data.name);
console.log(KovarApp.client[data.name]);
});
var addLogicMember = function(n){
return function(config){
var callback = null;
if(typeof config.callback !== 'undefined'){
var callback = config.callback;
delete config.callback;
}
call({
method: n,
data: config,
callback: callback
});
};
};
var call = function(config){
var c = count++;
var timer = null;
socket.on('reply_'+c,function(data){
if(typeof config.callback === 'function'){
if(timer != null){
timer.clearTimeout();
}
config.callback(data);
timer = setTimeout(function(){
socket.removeAllListeners('reply_'+c)
},10000);
}
});
config.data.handle = c; //make sure that the server has the handle for this function call
socket.emit(config.method,config.data);
};
};;
服务器向客户端发出5个函数:login是第一个函数,getpatientinfo是最后一个函数。在服务器上,我将它设置为console.log每个回复。如果我调用了其中的任何函数,那么它就是console.log的getpatientinfo,因为它是它接收到的字符串,这意味着在客户端上每个函数都引用最后接收到的字符串(getpatientinfo)。我已经根据一些答案改变了它,但它仍然不起作用。套接字在这里不应该是个问题。这个问题显然是我在生成成员时的前端逻辑,因为每个成员都反映了最后添加的成员。
解决!见下文! (这不是闭幕!)
你的实际问题是一个已被多次询问的范围问题(找到一个重复的,任何人?),但我想在旁边说,你不应该在数组中使用'for..in'循环。它们遍历对象的所有可枚举属性,而不仅仅是数组的所有元素。 – apsillers
雅无后顾之忧。它实际上使用套接字侦听器来触发成员添加。它实际上并不循环数组;我只是想轻松演示逻辑。 –
这不是重复的。该解决方案对我无效。我的功能是当从服务器调用时动态地向其自身添加成员,而不用外部循环添加函数。 –