在学习JS的变量作用域时,发现的一些奇怪现象。记录如下:
1 //全局变量:在全局作用域下的变量 2 //局部变量:在函数内部声明的变量 3 //注意: 4 //1、在函数内部没有var声明直接赋值的变量也是全局变量 5 //2、当变量名重复时,选择就近原则访问 6 var num0 = 0; 7 var num1 = 10; 8 function f4() { 9 var num2 = 20; 10 num3 = 30; 11 num0 = 0.1; // 给局部变量赋值 12 console.log(num0); //0.1 局部变量 13 console.log(num1); //undefined 局部变量,下方声明并赋值,这里显示未赋值 14 console.log(num2); //20 局部变量 15 console.log(num3); //30 全局变量 因为num3未声明 16 var num0; //声明了num0,所以是局部变量 17 var num1 = 11; //声明并赋值 18 console.log(num1); //11 局部变量 19 var num4 = 40; 20 console.log(num4); //40 21 num4 = 44; // 前面已经声明,所以是局部变量 22 console.log(num4); //44 23 } 24 f4(); 25 console.log(num0);//0 26 console.log(num1);//10 27 console.log(num2); //error 28 console.log(num3); //30 29 console.log(num4); //error
后来发现这是由于js的预解析处理模式导致的。
js引擎运行js分为两步:预解析+代码执行
1、预解析:js引擎会把js里面的所有的var(变量解析)和function(函数解析)提升到当前作用域的最前面;
2、代码执行:顺序执行
如:
f5(); //预解析后,在函数上面也可调用,这在python中可不行哦。
function f5() {
}
f5();
f6();//报错
var f6 = function () {
};
f6();
相当于:
var f6;
f6();
f6 = function () {
};