考虑下面的代码片段,
function(){
if(condition){
var json = { "stat":"success","count":"3" };
}
}
console.log(json);
return json;
在这里,json不应该给出正确的值,因为它的作用域已经结束了,但是我实际上可以得到json值。 有人能告诉我这是怎么运作的吗?
如果您的意思是这样的(实际运行的代码):
function test(){
if(condition){
var json = { "stat":"success","count":"3" };
}
console.log(json);
return json;
}
test();
您使用的是var
。 var
创建具有函数作用域而不是块作用域的变量。 因此,您的代码相当于:
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();
如果使用let
或const
而不是var
,则变量将是块作用域,这将产生错误:
function test(){
if(condition){
let json = { "stat":"success","count":"3" };
}
console.log(json);
return json;
}
test();
因为用const
或let
声明的json
变量仅在创建它的块作用域内可用,而且console.log(json)
和return json
都将在试图引用不再存在的变量时创建错误。