【发布时间】:2016-06-24 00:08:44
【问题描述】:
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;
});
}
在这段代码中,为什么当我调用函数测试时变量 id 没有关闭?它给出的错误 id 在测试函数中是未定义的。我是否以错误的方式理解闭包?
【问题讨论】:
-
你对闭包的理解是错误的。 JavaScript 作用域是词法和静态的。调用函数不会使被调用函数可以使用局部范围变量。
-
@Pointy 我已经编辑了代码。对于第一个数据包,我使用之后收到的数据中的详细信息获取 id,而无需对 redis 进行任何调用,我想继续代码。我可以做这样的事情吗?
-
不,您仍然遇到完全相同的问题。
-
是的,但如果我添加 var self = this.并通过此功能测试使用 self.id 更改 id。这是一个很好的做法。 ?
-
如果你让
id不是一个局部变量而是一个对象的一个属性,你可以将对该对象的引用传递给test(),然后异步调用可以修改属性值.
标签: javascript node.js closures