js变量声明作用域问题

时间:2021-10-29 06:48:08

1.先来看两个题

 var a = 1;
foo1();
function foo1(){
console.log(a); //输出1
}; foo2();
var a = 1;
function foo2(){
console.log(a); //输出undefined
};

首先这两题中应该要注意的是函数声明的提升,也就是function foo1(){}会自动被提升到顶部,所以foo1()的
调用是可以的。第一个输出1是毫无疑问的!那么第二个实际上被js引擎解析为:

 var a;
foo();
a=1;
function foo(){
console.log(a);
};

所以在foo2()被执行的时候a还没有被赋值,所以最后输出undefined.

2.再来看看下面的例题

 //
var a = 1;
function foo(){
a = 10;
return;
};
foo();
console.log(a); //输出10 //
var a = 1;
function foo(){
a = 10;
return;
var a = 2;
};
foo();
console.log(a); //输出1 //
var a = 1;
function foo(){
a = 10;
return;
var function a(){};
};
foo();
console.log(a); //输出1

第一个输出10应该没问题,里面给a设置成了全局变量。
而后两个则有所不同,在return语句后给定义了一个数字和函数。
在这里要说一下return!
return这一行分号后面或者隔行的语句都不会被执行,但可以被js引擎解析!
所以后两个会被解析为:

//
var a = 1;
function foo(){
var a;
a = 10;
return;
a = 2;
};
foo();
console.log(a); //
var a = 1;
function foo(){
var a;
a = 10;
return;
a = function(){};
};
foo();
console.log(a);

看到这里大家就知道为什么会输出1.
foo(){}里面a是局部变量,而函数内部的局部变量会在函数执行完毕之后被销毁,
所以最终输出的还是最初定义的a,也就是1.

以上是本人的一点学习心得,多谢指教!