js中var声明的变量会发生变量提升,提升的是变量的声明,赋值不提升;
let const声明的变量不会进行变量提升;
函数也会发生变量提升,并且函数变量提升的优先级高于var声明的变量;
案例1: 求以下函数输出
-
var val = 12;
function fun1(){
console. log(val);
var val =
20;
console.log(val);
}
fun1();
输出: undefined 20
解析:
当局部变量和全局变量同时存在时,局部变量的优先级更高。
上述代码等同于:
var val =12;
function fun1(){
var val;
console. log(val); //undefined
val =20;
console.log(val); //20
}
fun1();
案例2: 求以下函数输出
- var b = 3;
- (function(){
- b = 5;
- var b = 2;
- })();
- console.log(b);
输出: 3
解析:
立即执行函数内部,var发生变量提升,结果相当于 (function(){ var b; b=5; b=2; })() 所以这个立即执行函数并没有改变全局环境中的b,所以全局环境中的b依旧是3。
案例3: 求以下函数输出
- var a = 3;
- (function(){
- b = 5;
- })();
- console.log(b);
输出: 5
解析:
与案例2不同,自执行函数内部没有用var声明的变量是全局变量,因此b=5将全局变量b的值从3改为5,输出5;
案例4: 求以下函数输出
求以下函数输出
var
bb = 1;
function
aa(bb) {
bb = 2;
alert(bb);
};
aa(bb);
alert(bb);
输出 2 1
解析:
在aa函数中,bb是以传值的方式传入的,在函数中,会重新定义一个bb局部变量,并将其值覆为2,并不影响函数体外的bb变量,所以其值仍然为1.
代码等值于如下:
var
bb = 1;
function
aa(bb) {
var
bb = 2;
alert(bb); //2
};
aa(bb); //2
alert(bb); //1