一.预解析概念
JS引擎在运行JS时通常分为两步,首先是预解析,然后执行代码
预解析分为**变量预解析和函数预解析。引擎会把JS里面所有的var和function**提升到当前作用域的最前面。
A 变量预解析:即变量提升,所谓变量提升就是把所有的变量声明提升到当前作用域的最前面。它只提升变量声明,不提升赋值。
例如 :var num = 10; 就相当于
var num;num =10;
B 函数预解析:即函数提升,所谓函数提升就是把所有函数声明提升到当前作用域的最前面,但不调用函数。
fn();function fn(){console.log(123);};//虽然调用方法写在了函数之前,但是根据函数预解析规则,函数会被提升到作用域最前面。//所以这段代码是可以正常输出结果的。
二.预解析案例
var num = 10;fun();function fun(){console.log(num);var num = 20;}// 预解析分析var num;function fun(){var num;console.log(num);num = 20;}num = 10;fun();// 输出结果为undefined
var num = 10;function fn(){console.log(num);var num = 20;console.log(num);}fn();// 预解析分析var num;function fn(){var num;console.log(num);num = 20;console.log(num);}num = 10;fn();// 输出结果为undefined和20
var a = 18;f1();function f1(){var b = 9;console.log(a);console.log(b);var a = '123';}// 预解析分析var a;function f1(){var b;var a;b = 9;console.log(a);console.log(b);a = '123';};a = 18;f1();// 输出结果为undefined和9
f1();console.log(c);console.log(b);console.log(a);function f1(){var a = b = c =9;console.log(a);console.log(b);console.log(c);}// 预解析分析function f1(){var a;a = b = c =9; //相当于var = 9; b = 9; c = 9; b和c直接赋值,是全局变量console.log(a);console.log(b);console.log(c);}f1();console.log(c);console.log(b);console.log(a);//报错// 输出结果为9,9,9,9,9和报错
