callback中的variables的扩展node.js

我有下面这段代码,它应该为TCP服务器的三个端口configuration实现三个callback函数。 控制台输出应该报告它build立的三个通道中的哪一个,但是这不可能是因为variables“i”的扩展在callback的运行时间完成,因此得到i的最后一个值是2。
我的问题:当定义callback时,如何让节点扩展variables“i”?

感谢您提前帮忙。



 var p_arr = [ {src_port: 5500, src_host: "localhost", dst_port: 5501, dst_host: "localhost"}, {src_port: 5502, src_host: "localhost", dst_port: 5503, dst_host: "localhost"}, {src_port: 5504, src_host: "localhost", dst_port: 5505, dst_host: "localhost"}, ]; for (var i in p_arr) { try { rcv_soc[i] = net.createServer(function (stream) { if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port); stream.on("data", function (data) { if (verbose & 4) console.log("Received from app %d: %s", i, data); }); }); rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host); } catch (err) { console.log("No connection possible !!"); } } 

把它作为参数包裹在一个自我执行的函数中:

 for (var i in p_arr) (function(i) { try { rcv_soc[i] = net.createServer(function (stream) { if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port); stream.on("data", function (data) { if (verbose & 4) console.log("Received from app %d: %s", i, data); }); }); rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host); } catch (err) { console.log("No connection possible !!"); } })(i) 

这是由于Javascript中的范围规则。

最简单的解决scheme是使用forEach为数组中的每个项目创build一个新的(函数)作用域:

 p_arr.forEach(function(entry, i) { // 'entry' is the same as 'p_arr[i]' ... });