我有这段代码:
index
使用临时变量
0
1
创建闭包。这输出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);
});
});
}
正如所料,打印我想要在闭包中捕获的值。
类似于http get callback的代码不起作用。
2
2
此代码输出:
if (event.getSource() == b) {
Thread th=new Thread() {
public void run() {
b.setText("1");
try {
Thread.sleep(5000);
}catch (Exception e) {
}
b.setText("2");
try {
Thread.sleep(5000);
}catch (Exception e) {
}
b.setText("3");
}
};
th.start();
}
我错过了什么?
答案 0 :(得分:1)
var j = i;
将设置i
的值,这是第一次响应时数组的长度,这就是每次登录时获得2
的原因。
调用匿名函数作为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));
}
&#13;
答案 1 :(得分:1)
javascript(es5)中没有块范围。所以你使用的for循环不会成功。相反,尝试:
urls.forEach(function(url, i){
http.get( url , function(res) {
res.setEncoding('utf-8');
res.on("data", function(d) {
console.log(i);
});
});