我想this is how you make a variable inside a if/else block global (Case 3).
connection.query(sql, function (err,rows){
//Handle Errors
if(err){
//Log The Error & Die
}
//If Successful - Log Results For Now (Change To Export Results)
else {
//console.log(rows);
foo = rows;
}
});
console.log(foo); // Out: undefined
为什么我不能在函数外部访问变量?
解
嗯,这里的问题是了解异步性究竟是什么。与@AmmarCSE和looking at this great question here on SO聊天后,我明白我的问题(以及我的代码,显然)不正确。
我试图访问一个未定义的变量,直到函数完成运行(对远程数据库的SQL查询显然需要更长时间才能完成然后运行本地脚本)。但是,如果我构造我的代码异步,则只有在函数完成后才会调用变量。
事实证明,这不是变量范围的问题,实际上是变量定义时间(不确定这是否是当时正确的术语)在变量定义的脚本中 - CS专业,随意编辑正确的术语。)
无论如何,这是新代码:
runSQL(function(result){
//Do Whatever you want with the results - they're defined!!
console.log(result);
)};
function runSQL(callback){
connection.query(sql, function (err,rows){
//Handle Errors
if(err){
//Log The Error & Die
}
//If Successful - Log Results For Now (Change To Export Results)
else {
callback(rows);
}
});
}
答案 0 :(得分:1)
当您在error callback
时,它已定义了自己的范围。因此,foo
仅对该闭包和任何嵌套闭包可见。对于您在链接中提到的案例3
var a = 1;
function four() {
if (true) {
var a = 4;
}
alert(a); // alerts '4', not the global value of '1'
}
他们在正确的闭包function four()
内警告变量,即使该变量在if
块中定义,它的父函数也可以看到。
但是,您通过不添加foo
前缀来制作var
全球。但是,在回调后记录会导致undefined
,因为此时尚未定义foo
。如果您在错误回调中登录它将会起作用,但我建议您重新构建代码以使用异步回调的性质
connection.query(sql, function (err,rows){
//Handle Errors
if(err){
//Log The Error & Die
}
//If Successful - Log Results For Now (Change To Export Results)
else{
//console.log(rows);
foo = rows;
}
console.log(foo);
});
答案 1 :(得分:0)
如果你把var foo = "something"
放在某个地方它会等于“某事”。我想它没有进入其他地方,否则它等于rows
...也可能rows
未定义?
如果var foo =
位被执行,那么在任何地方都不使用foo =
它就会变成一个全局变量,这可能是不可取的......
答案 2 :(得分:0)
var result= connection.query(sql, function (err,rows){
//Handle Errors
if(err){
//Log The Error & Die
}
//If Successful - Log Results For Now (Change To Export Results)
else{
//console.log(rows);
document.foo = rows;
}
});
result.on('result', function(){
console.log(document.foo);
}