为什么Count增加,Closure问题

时间:2015-05-28 00:46:23

标签: javascript node.js

基本上我在这里尝试做的是,使用nmap / nodejs在7台机器上进行nmap扫描,然后当响应回来时,我将其写入客户端页面。 当我运行它时它工作正常。它使用闭包,包装变量计数,所以每个回调得到count = 0。

现在我不明白,为什么count的值按照console.log从1增加到7。根据我的理解,每种方法都可以计算。

有人可以解释为什么这是

nodejs ::

的输出
server is listening
8.8.8.1
8.8.8.2
8.8.8.3
8.8.8.4
8.8.8.5
8.8.8.6
8.8.8.8
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
ending the response

代码::

var http = require('http');
var cb = function(httpRequest, httpResponse){
var count = 0;

var ips = [];
ips.push('8.8.8.1');
ips.push('8.8.8.2');
ips.push('8.8.8.3');
ips.push('8.8.8.4');
ips.push('8.8.8.5');
ips.push('8.8.8.6');
ips.push('8.8.8.8');

var exec = require('child_process').exec;
for(var i =0; i< ips.length ; i++)
{
    exec('nmap.exe -v ' + ips[i], function(error, stdout, stderr) {

        if(error)
        {
            httpResponse.write(stderr);
            httpResponse.write("</br>")
            httpResponse.write("*************************");
        }
        else
        {
            httpResponse.write(stdout);
            httpResponse.write("</br>")
            httpResponse.write("*************************");
        }

        count = count + 1;

        console.log('count = ' +  count);

        if (count === 7)
        {
            console.log('ending the response');
            httpResponse.end();
        }

    });

    console.log(ips[i]);
}
}

var server = http.createServer(cb);

server.listen(8080, function(){
    console.log('server is listening');
});

-Thanks

3 个答案:

答案 0 :(得分:1)

因为在代码的第3行的全局空间中声明了count,所以每个循环都将外部计数增加1。这不会导致您的计数重置。如果要实例化新的计数变量,则需要在循环中声明var count

答案 1 :(得分:0)

count从1增加到7,因为在循环的每次迭代中,它都会增加1,循环遍历包含7个元素的ips数组。每个新请求都会将计数重置为0.每个请求都会迭代所有7个元素。

答案 2 :(得分:0)

看起来你想在count变量上使用闭包。但是,您没有在count变量上实现闭包。为了将count的副本传递给每个异步函数,您应该在以count作为参数的函数调用中包装相应的代码块。例如:

var exec = require('child_process').exec;
for(var i =0; i< ips.length ; i++)
{
(function(count) { //Start of closure function storing a local copy of count
exec('nmap -v ' + ips[i], function(error, stdout, stderr) {

    if(error)
    {
        httpResponse.write(stderr);
        httpResponse.write("</br>")
        httpResponse.write("*************************");
    }
    else
    {
        httpResponse.write(stdout);
        httpResponse.write("</br>")
        httpResponse.write("*************************");
    }

    count = count + 1;

    console.log('count = ' +  count);

    if (count === 7)
    {
        console.log('ending the response');
        httpResponse.end();
    }

});
})(count); // end of closure function
console.log(ips[i]);
}

运行它会得到输出:

count = 1
count = 1
count = 1
count = 1
count = 1
count = 1
count = 1