JavaScript预编译

JS执行三部曲

1.语法分析。系统会通篇扫描代码,查看是否有代码的语法错误。

2.预编译.分析结束后,就会进行预编译。

3.解释执行

function test(){
    consoel.log("a");
}

test();// a

上面test()代码很明显是可以执行结果是a

但是如果这样那?

test();
function test(){
    consoel.log("a");
}

能输出吗?可以,那么疑问来了JS不是解释语言吗?test()在执行的时候,函数test应该还没有定义但是为什么能够执行出来结构那?这就是预编译做的事情。

再来一个

console.log(a);// undefined

var a = 10;

现在为什么a变量输出结果是nudefined报错显示。他不是应该没有定义报错吗?那么这是什么原因,可以给你说这是预编译这哥们做的。

为什么现在给你两句话:

1.函数声明整体提升

2.变量 声明提升

就是你写一个函数,不管你写在哪里系统总是会把函数提升带代码逻辑最前面。

--以上的是函数的执行上下文

还有全局的执行期上下文:(GO),只不过比函数的执行期上下文少了一步,第三部,实参形参相统一。第一步变成了胜场GO对象。

其实GO就是window

所以说你在全局中声明一个变量a;然后console.log(a);就是去GO中访问a也就是window.a;先生成GO,全局的GO生成在全局执行的前一刻。

console.log(test);

function test(test){
    console.log(test);//fu
    var test=234;
    console.log(test);//234
    function test(){}  
}

test(1);

var test=2;

GO{

  test : undefined

}

GO{

    test : function test(test){

    //...

    }

}第一行代码结果就是:

function test(test){

    //...

    }

执行test(1);

先 生成AO{

    test : undefined

}

预编译不会看if语句的括号

原文地址:https://www.cnblogs.com/-alvin/p/9782603.html