我有这段代码:
var responses = [];
for( var i=0; i < Number(process.argv[2]); i++) {
responses.push(function () {
var index = i;
function bar() {
console.log(index);
}
return bar;
}());
}
responses.forEach(function(d){
d();
});
其中使用临时变量index
创建闭包。这输出
0
1
正如预期的那样,打印我想要在闭包中捕获的值。
与 http get 回调类似的代码不起作用。
var http = require("http");
var urls = ["http://yahoo.com","http://google.com"];
for( var i=0; i < urls.length; i++) {
http.get( urls[i] , function(res) {
var j = i;
res.setEncoding('utf-8');
res.on("data", function(d) {
console.log(j);
});
});
}
此代码输出:
2
2
我错过了什么?
最佳答案
var j = i;
将设置 i
的值,它是第一次响应时数组的长度,这就是您得到 2
的原因code> 每次登录时。
调用匿名函数作为http.get
的第二个参数,它将返回内部函数来处理响应,并且它还会记住创建它的环境。传递的参数i
的值将在内存中供稍后使用。
试试这个:
var http = require("http");
var urls = ["http://yahoo.com", "http://google.com"];
for (var i = 0; i < urls.length; i++) {
http.get(urls[i], (function(i) {
return function(res) {
res.setEncoding('utf-8');
res.on("data", function(d) {
console.log(i);
});
}
})(i));
}
关于javascript - Node js 中的关闭未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35973699/