JavaScript的预解析
1、我们js引擎运行分为两步:预解析 代码执行
(1)预解析 js引擎会把js里面所写的var 还有function 提升到当前作用域的最前面。
(2)代码执行 按照代码书写的书怒从上往下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升:就是把所有的变量声明提升到当前作用域最前面,不提升赋值操作,所以,例如var fun = function(){}要是该变量的调用在在赋值之前,那么会报错
(2)函数提升:就是把所有函数声明提升到当前作用域的最前面, 不调用函数。
例如:以下程序输出的是几?
var num = 10; test = function () {//在函数内部可以访问函数外部的变量,其实num属于全局变量 //num就是链式查找的方式,上层有,就用上层,上层没有,就继续往上找,所以就叫做作用域链 console.log(num);//输出10 } test();
var num = 10; fun(); function fun() { console.log(num);//在改输出的后面有定义num var num = 20; }
解析:上面的代码类似于如下,在预解析后如下:
var num = 10;
fun();
function fun() {
var num;
console.log(num);
num = 20;
}
var num = 10; function fn() { console.log(num);//unfined var num = 20; console.log(num);//20 } fn(); 解析:上面的代码类似于如下,在预解析后如下: var num = 10; function fn() { var num; console.log(num); num = 20; console.log(num); }
fn(); console.log(c);//fn中的c为全局变量,值为10 console.log(b);//fn中的b为全局变量,值为10 console.log(a);//fn中的a为局部变量,会报错 function fn() { var a = b = c = 10; console.log(a);//10 console.log(b);//10 console.log(c);//10 }
解析:fn中var a为局部变量,b、c为全局变量。所以