Javascript 闭包中的变量,但无法访问
在这段代码中,为什么调用函数测试时变量id不是闭包?它给出的错误id在测试函数中未定义。我是否以错误的方式理解闭包 函数Javascript 闭包中的变量,但无法访问,javascript,node.js,closures,Javascript,Node.js,Closures,在这段代码中,为什么调用函数测试时变量id不是闭包?它给出的错误id在测试函数中未定义。我是否以错误的方式理解闭包 函数test——以及所有其他函数——只查看全局变量、函数本身中定义的变量以及与函数定义相关的封闭范围中定义的变量 在调用函数的作用域中看不到变量。如果要使函数可以访问这些变量,则必须将这些变量作为参数传递。函数test--以及所有其他函数--只查看全局变量、函数本身中定义的变量以及与函数定义相关的封闭范围中定义的变量 在调用函数的作用域中看不到变量。如果要使这些变量可供函数访问,则
test
——以及所有其他函数——只查看全局变量、函数本身中定义的变量以及与函数定义相关的封闭范围中定义的变量
在调用函数的作用域中看不到变量。如果要使函数可以访问这些变量,则必须将这些变量作为参数传递。函数
test
--以及所有其他函数--只查看全局变量、函数本身中定义的变量以及与函数定义相关的封闭范围中定义的变量
在调用函数的作用域中看不到变量。如果要使这些变量可供函数访问,则必须将其作为参数传递。是的,闭包无法看到在单独函数中定义的变量。变量在词汇(函数)范围内(如lex82和Pointy所述)
您只能在test()内部定义
var id='
或在test()函数中传递id变量。是的,闭包无法看到在单独函数中定义的变量。变量在词汇(函数)范围内(如lex82和Pointy所述)
您只能在test()内部定义
var id='
或在test()函数中传递id变量。您理解闭包的方法是错误的。JavaScript作用域是词法和静态的。调用函数不会使被调用函数使用局部作用域变量。@Pointy我已经编辑了代码。对于第一个数据包,我使用收到的数据中的详细信息获取id,之后我没有调用redis,我想继续代码。我可以这样做吗?不,你仍然有完全相同的问题。是的,但是如果我加上var self=this。并通过此功能测试,使用self.id更改id。这是一种很好的做法吗?如果使id
不是局部变量,而是对象的属性,则可以将对该对象的引用传递给test()
,然后该异步调用可以修改属性值。您理解闭包的方式不对。JavaScript作用域是词法和静态的。调用函数不会使被调用函数使用局部作用域变量。@Pointy我已经编辑了代码。对于第一个数据包,我使用收到的数据中的详细信息获取id,之后我没有调用redis,我想继续代码。我可以这样做吗?不,你仍然有完全相同的问题。是的,但是如果我加上var self=this。并通过此功能测试,使用self.id更改id。这是一种很好的做法吗?如果使id
不是局部变量,而是对象的属性,则可以将对该对象的引用传递到test()
,然后该异步调用可以修改属性值。是否有任何方法可以从函数更改父作用域中的变量。i、 e我可以从test function更改id吗?@user3508612在本例中,否-test()
函数本身正在调用另一个异步操作。您可以从同步函数返回值,但在这种情况下,这没有意义。我已经更新了代码。我可以这样做吗?有什么方法可以从函数更改父作用域中的变量吗。i、 e我可以从test function更改id吗?@user3508612在本例中,否-test()
函数本身正在调用另一个异步操作。您可以从同步函数返回值,但在这种情况下,这没有意义。我已经更新了代码。我可以这样做吗?
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;
});
}