关于JavaScript的预编译

132 阅读1分钟

首先看几个代码片段:

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

现象表明,无论声明顺序如何,预编译结束以后, 声明的变量最终都会成为函数体。值得注意的是,函数声明在代码执行后,会受到赋值的影响。