Javascript – 从外部调用variablesIf / Else Block返回未定义

我认为这是如何在if / else块全局内部创build一个variables(案例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 

为什么我不能访问函数之外的variables?

那么这里的问题就是理解什么是asynchronous 。 与@AmmarCSE聊天后, 在这里看到这个伟大的问题,所以我明白,我的结构我的问题(和我的代码,显然)不正确。

我试图访问一个未定义的variables,直到函数完成运行(对远程数据库的SQL查询显然需要更长时间才能完成,然后运行本地脚本)。 但是,如果我以asynchronous方式构build代码, 只有在函数完成后才会调用该variables。

事实certificate,这不是variables范围的问题,而是variables定义时间的问题 (不知道这是否是在variables被定义的脚本中的正确术语 – 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); } }); } 

当你在error callback ,它有自己的范围定义。 因此, foo仅对该闭包和任何嵌套闭包是可见的 。 案例3你已经在链接中提到

 var a = 1; function four() { if (true) { var a = 4; } alert(a); // alerts '4', not the global value of '1' } 

它们会在正确的闭包中提醒variables, function four() ,即使该variables是在if块中定义的,它的父函数也是可见的。

但是,你是通过不使用var前缀来使foo成为全局的。 然而,callback之后的日志logging导致undefined因为那时foo还没有定义。 如果您在错误callback中login,它将会正常工作,但我build议您重构代码以处理callback的asynchronous性质

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

如果你把var foo = "something"放在某个地方,它会等于“something”。 我想它没有进入别的地方,否则它会等于rows …还有可能rows是不确定的?

也不用var foo =任何地方它成为一个全局variables,如果foo =位执行,这可能是不可取的…

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