javascript - Node js 中的关闭未按预期工作

标签 javascript node.js closures

我有这段代码:

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/

相关文章:

javascript - 如何正确分配 jQuery 事件处理程序?

javascript - 从下拉列表中的数据库中获取值

javascript - 在 Node.js 中响应 JSON 对象(将对象/数组转换为 JSON 字符串)

javascript - 使用cheerio.js进行抓取,得到: Error: Can only perform operation while paused

javascript - 一个 JavaScript 闭包混淆

closures - 闭包和嵌套闭包有什么区别?

JavaScript oop : Designing classes correctly

javascript - 使用来自 JSON 的 Google Charts API 创建饼图

javascript - 仅显示 3 个图像中的 1 个图像,功能使用吗?

node.js - 多个单 Html 页面 Sails.js