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为全局变量。所以
 

 

posted @ 2021-12-11 18:02  洛飞  阅读(179)  评论(0编辑  收藏  举报