首先看几个代码片段:
console.log(a);//Uncaught ReferenceError: a is not defined
console.log(b);//不输出
js代码执行前,会经历一遍代码检查的过程,如果存在错误,则代码不会运行。
console.log(a);//undefined
var a = 1;
console.log(a);//1
console.log(a);// ƒ a(){}
function a(){};
console.log(a);// ƒ a(){}
console.log(b);// undefined
var b = function(){};
console.log(b); // ƒ (){}
此时console在前,却没有报错,并成功执行了所有代码。
由此可见:
- 在JS代码执行之前,系统会先检查一边代码的正确性,无误后才会执行。
- 变量声明会提升,但是赋值不会提升。
一个有趣的现象:
console.log(a);// ƒ a(){}
var a = 10;
function a(){};
console.log(a);// 10
console.log(b);// ƒ b(){}
function b(){};
var b = 10;
console.log(b);// 10
console.log(a);// ƒ a(){}
var a = 10;
function a(){ return '函数执行' };
console.log(a);// 10
console.log(a());// Uncaught TypeError: a is not a function
现象表明,无论声明顺序如何,预编译结束以后, 声明的变量最终都会成为函数体。值得注意的是,函数声明在代码执行后,会受到赋值的影响。