Javascript - 从If / Else块之外调用变量返回未定义

时间:2015-06-13 09:32:59

标签: javascript node.js scope global-variables

我想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);            
        }

    });

}

3 个答案:

答案 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);
}