关闭变量但无法访问

时间:2016-03-09 14:39:21

标签: javascript node.js closures

var net = require('net');
var redis = require('redis'); 
var redisClient = redis.createClient("redis://localhost:6379");

redisClient.on("connect",function(){
    console.log("Connected to Redis");
});

net.createServer(function(socket){
    console.log('CONNECTED: ' + socket.remoteAddress +':'+  socket.remotePort);
    var id = '';
    socket.on('data',function(data){
        console.log(id);
        if(id == '')
              test();
        else
           //do something else
    });
}).listen(10000,'');


function test(){
     redisClient.hgetall('12345',function(err,res){
         id = res.id;
     });
}

在这段代码中,当我调用函数test时,为什么变量id不是闭包?它在测试函数中未定义给出错误ID。我是以错误的方式理解闭包吗?

2 个答案:

答案 0 :(得分:2)

函数test - 以及所有其他函数 - 只能看到全局变量,函数本身定义的变量以及关于函数 definition 的封闭范围中定义的变量。 / p>

您不会在调用该功能的范围内看到变量。如果要使函数可以访问它们,则必须将这些变量作为参数传递。

答案 1 :(得分:0)

是的,闭包不能看到在单独的函数中定义的变量。变量是词法(函数)作用域(如lex82和Pointy所述)。

您只能在test()中定义var id = ''或在test()函数中传递id变量。