美文网首页
javascript预编译

javascript预编译

作者: 啦啦啦_e26f | 来源:发表于2019-02-22 15:36 被阅读22次

一、js的运行三部曲
1,语法分析:简单来说就是通篇扫描一遍,看看有没有语法错误;
2,预编译:预编译发生再执行的前一刻,会做两件事情,(1)函数声明整体提升(2)变量 声明提升
3,解释执行:js有两个特性,单线程和解释性语言,啥叫解释性语言,简单来说就是解释一句执行一句

二、预编译
1,imply global 暗示全局变量:即任何变量,如果没有经过声明就赋值,此变量就为全局所有

function test(){
        c = 123;//c未经声明就赋值,此时c就为全局变量,可以通过window.c访问到
    var a = b = 123;//先将123赋值给b,发现b没有声明,此时b就为全局变量,可以通过window.b访问到
 }
 console.log(c);//123
 console.log(b);//123

2,一切申明的全局变量全是window的属性

var a = 123; ===> window.a = 123;
console.log(a);//123
console.log(window.a);//123

函数预编译四部曲:
1,创建AO (Activation Object)对象,就是执行期上下文
2,找形参和变量声明,将变量和刑参作为AO对象的属性,值为undefined
3,将实参值和刑参的值统一
4,在函数体里面找函数声明,将函数名作为AO对象的属性值挂起来,值赋予函数体
全局预编译:
1,创建GO (Global Object === window)对象,就是执行期上下文
2,找变量声明,将变量作为AO对象的属性,值为undefined
3,在函数体里面找函数声明,将函数名作为AO对象的属性值挂起来,值赋予函数体

function test(a){        
    console.log(a);                      
    var a = 123;  
    console.log(a);                               
    function a () {}  
    console.log(a);                                               
    var b = function () {}
    console.log(b); 
    function d (){}
}
test();
 //首先创建AO 对象 AO{}
// 然后找刑参和变量声明,将变量和刑参作为AO对象的属性,值为undefined    
 // AO {                                                                                                                    
//        a:undefined,
//        b:undefined,       
//  }
//再将实参和刑参的值统一
// AO {
//        a:1, 
//        b:undefined
//  }
//在函数体里面找函数申明,将函数名作为AO对象的属性值挂起来,值赋予函数体
// AO {
//        a:function  a () {}, 此时同命的a被覆盖
//        b:undefined,
//        d:function d () {}
//  }
//此时AO对象已经创建完毕,预编译结束,开始执行函数(预编译发生在函数执行的前一刻),AO对象就是我们所说的作用域
//代码执行过程分析:
//第一行代码开始执行,console.log(a);找AO对象拿值,输出function a(){}
//第二行代码var a = 123;开始执行,var a在预编译期间已经执行,此时实际上相当于执行 a = 123;此时AO对象的a的值已经变为123
//第三行代码执行,console.log(a);找AO对象拿值,输出123
//第四行代码,function a(){},预编译期间已经执行,跳过
//第五行代码,console.log(a);找AO对象拿值,输出123
//第六行代码,执行,AO属性的b的值为function () {}
//第七行代码,console.log(b);找AO对象拿值,输出funcion  (){}
//第八行代码预编译期间已经执行,跳过
//函数执行完,AO对象变为
// AO {
//        a:123, 此时同命的a被覆盖
//        b:function () {},
//        d:function d () {}
//  }

相关文章

  • JavaScript 的“预 编译”

    JavaScript 执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的。而且,在同一段程序的分析执行...

  • 你需要知道的javascript的提升

    javascript在执行前会有一个预编译过程,预编译过程会先预声明变量再预定义函数,比如 预编译过后,类似于 运...

  • 3、node的核心模块

    JavaScript核心模块的编译过程; 在编译所有C/C++文件之前,编译程序需要将所有的JavaScript模...

  • JavaScript 编译原理、编译器、引擎及作用域

    首先,JavaScript确实是一门编译型语言,与C等典型编译型语言相比,区别在于JavaScript的编译过程(...

  • JavaScript预解析

    对一段js代码,js引擎并不是读一句执行一句,而是读取一段、解释执行一段。而一段一段执行,js会对读取的这段js代...

  • javaScript预解析

    js是运行在浏览器端的,浏览器内部众多功能中有一个小功能叫做js解析器。js在解析器在运行js代码时分为下面两步:...

  • JavaScript 预解析

    概念:函数或者变量都会有一个提前解析的过程,js会把函数或者变量提前解析一下、解析到它们对应的作用域最开始的位置 ...

  • JavaScript预解析

    简介js作为一门解释型脚本语言,特点是边解析边执行。而预解析则是,提前解析的意思,也就是所说的变量提升。在ES6之...

  • ts篇-vue-cli3 + ts + Decorator +

    TypeScript 是 JavaScript 的类型的超集,它可以编译成纯 JavaScript。编译出来的 J...

  • TypeScript学习总结(一)

    前言 TypeScript 是 JavaScript 的一个超集,它可以编译成纯 JavaScript(编译出来的...

网友评论

      本文标题:javascript预编译

      本文链接:https://www.haomeiwen.com/subject/vtgsyqtx.html