JS的解析过程分为两个阶段:预编译期(预处理)与执行期
- 预编译期 JS会对本代码块中的所有var声明的变量和函数进行处理
- 执行期 会按照代码块的顺序逐行执行
注意事项
- 函数处理
预编译期会对所有定义的函数做声明,所以js中的函数定义位置在执行期不分前后 - 变量处理
var 变量预编译期会声明为undefined
console.log(temp) //undefined
var temp = 1;
console.log(temp) //1
let/const不会做声明,只按照正常流程执行
console.log(temp) //Error: not defined
let / const temp = 1;
console.log(temp) //1
扩展1
var a = 1;
function f(){
console.log('in f',a);
a = 2;
console.log('in f',a);
var a = 3; // let /const 则会报错
console.log('in f',a);
}
f();
console.log(a);
结果
in f undefined
in f 2
in f 3
1
扩展2
变量声明问题
var a,b;
(function (){
console.log('in f',a,b);
var a = b = 3; //var a = 3,b = 3;
console.log('in f',a,b);
})();
console.log(a,b);
结果
in f undefined undefined
in f 3 3
undefined 3
结论:
函数的中使用var声明的变量时会优先使用本代码块中声明的var变量。
附录说明:
- 建议变量的声明采用let/const来代替更为严格,如var可以对同一个变量跨作用域访问,还可以重复声明一个变量,容易造成不必要的bug。
- 变量的声明最好写在顶端
- 赋值式函数因为类似声明变量,所以也要提前声明,声明式函数则不需要。
网友评论