1. 概念
- JS 是一种解释型语言,就是在代码执行之前,先对代码进行通读和解释,然后再执行代码
- 也就是说,JS 代码在运行的时候会经历两个环节;解释代码 和 执行代码
- JavaScript 引擎在对 JavaScript 代码进行解释之前,会对代码进行预解析,在预解析阶段,会将以关键在
var和function开头的语句块提前进行处理 - 处理过程:当变量和函数的声明语句处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头
2. 预解析的内容
-
var关键字:预解析过程中会把var关键字声明的变量进行提前声明,但是不进行赋值console.log(num); // undefined var num = 100; console.log(num); // 100 -
声明式函数:预解析过程中遇到声明式函数,会在内容中先声明有一个
console.log('fn:', fn); // undefined fn(); // err: Uncaught TypeError: fn is not a function var fn = function() { console.log('fn 函数') } fn();
这里报错是因为预解析只是声明了一个 fn 变量,没有给它赋值函数
3. 预解析中的重名问题
-
当使用
var声明变量和声明式函数重名的时候,以函数为主 -
这种重名的处理规则只限于在解析阶段
num(); var num = 100; num(); // err: num is not a function function num() { console.log('num function')}; num();