提问者:小点点

在NodeJS中函数之外的json变量的作用域是什么?


考虑下面的代码片段,

 function(){
    if(condition){
      var json = { "stat":"success","count":"3" };
    }
 }
 console.log(json);
 return json;

在这里,json不应该给出正确的值,因为它的作用域已经结束了,但是我实际上可以得到json值。 有人能告诉我这是怎么运作的吗?


共1个答案

匿名用户

如果您的意思是这样的(实际运行的代码):

 function test(){
    if(condition){
      var json = { "stat":"success","count":"3" };
    }
    console.log(json);
    return json;
 }

 test();

您使用的是varvar创建具有函数作用域而不是块作用域的变量。 因此,您的代码相当于:

 function test(){
    var json = undefined;           // variable is function scoped
    if(condition){
      json = { "stat":"success","count":"3" };
    }
    console.log(json);              // can access here, may have undefined value
    return json;
 }

 test();

如果使用letconst而不是var,则变量将是块作用域,这将产生错误:

 function test(){
    if(condition){
      let json = { "stat":"success","count":"3" };
    }
    console.log(json);
    return json;
 }

 test();

因为用constlet声明的json变量仅在创建它的块作用域内可用,而且console.log(json)return json都将在试图引用不再存在的变量时创建错误。