js预编译和函数执行

javascript 执行过程

1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)
2.词法分析(预编译)

(1)创建全局GO(global object)对象

(2)对var声明的变量进行声明提升但不赋值,放入GO对象中

(3)对函数体整体进行提升,放入GO对象中

3.逐行执行

一.全局 直接是script标签中的代码,不包括函数执行

    <script type="text/javascript">
            console.log(a);

            var a = 100;
            console.log(a)

            var b = 200
            var c = 300
            function a(){

            }
            function fun(){

            }
</script>

执行前:
1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析

GO = {
      ...//省略自带属性
}

2.分析变量声明,变量名为属性名,值为undefined

GO = {
    a : undefined,
    b : undefined,
    c : undefined
}

3.分析<b>函数声明</b>,函数名为属性名,值为函数体,如果函数名和变量名相同,则将其覆盖

GO = {
    a : function a(){

},
    b : undefined,
    c : undefined,
    fun : function fun(){

    }
}

此时,GO就是预编译完成的最终对象,词法分析结束

4.逐行执行,分析过变量声明,函数声明,这里就不用管了,只管赋值(变量赋值)
当执行到“var a = 100;”的时候,a赋了一次值,值改变为100

GO = {
    a : 100,
    b : undefined,
    c : undefined,
    fun : function fun(){

    }
}

所以代码的执行结果是:

二.函数执行时

  

函数执行时

创建AO对象 activation object

找形参和变量声明,将变量和形参名作为AO属性名,值为undefined

将实参和形参统一

在函数体里面找到函数声明,值赋予函数体

            function test(){
                console.log(b);
                if(a){    //undefined转换成false
                    var b = 100;
                }
                c = 123;
                console.log(c);
            }
            var a;

            test();

            a = 20;

            test();

            console.log(c);

执行过程:

生成GO

GO = {

}

变量声明

GO = {
    a : undefined
}

函数声明

GO = {
    a : undefined,
    test : function
}

逐行执行;
test调用,生成test.AO ={}
参数 没有,跳过
变量声明

test.AO = {
    b : undefined
}

函数声明 没有,跳过
得到结果

test.AO = {
    b : undefined
}

逐行执行
改变GO

GO = {
    a : undefined,
    test : function,
    c : 123
}

a值发生改变

GO = {
    a : 20,
    test : function,
    c : 123
}

test调用 生成test.AO={}
参数 没有 跳过
变量声明

test.AO = {
    b : undefined
}

函数声明 没有
结果

test.AO = {
    b : undefined
}

逐行执行

test.AO = {
    b : 100
}

执行结果:

原文地址:https://www.cnblogs.com/qsdf/p/10133655.html

时间: 2024-10-14 10:55:59

js预编译和函数执行的相关文章

关于js预编译以及js文件执行顺序的几个问题。

关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a           <script type="text/javascript" src="xxx.js"$amp;>amp;$lt;/script>           //情形b            <script type="text/javascript">           code......       

js预编译

先来做三个测试 eg1: 1 var a; 2 a = 1; 3 4 function a() {}; 5 console.log(a); eg2: 1 var a; 2 function a() {}; 3 console.log(a); eg3: 1 var a; 2 function a() {}; 3 a = 1; 4 console.log(a); eg1:输出1   eg2:输出a方法   eg3:输出1 为什么输出结果是这样的? 先来看看js预编译实现过程: 1.js首先扫描var

typeof、摇树优化、js预编译

typeof:  typeof用以获取一个变量或者表达式的类型,一元运算符 null:空.无.表示不存在,当为对象的属性赋值为null,表示删除该属性 undefined:未定义.当声明变量却没有赋值时会显示该值.可以为变量赋值为undefined number:数值.最原始的数据类型,表达式计算的载体 string:字符串.最抽象的数据类型,信息传播的载体 boolean:布尔值.最机械的数据类型,逻辑运算的载体 object:对象.面向对象的基础 注意:没有数组,因为type数组时结果是ob

Handlebars.js 预编译(转)

Handlebars.js 官网上对预编译1是这样说的: 你需要安装 Node.js 你需要在全局环境中,通过 Npm 安装 handlebars 包 然后你就可以通过命令预编译你的 handlebars 模板文件: $ handlebars <input> --output <output> 假设我有一个模板文件,名称为 person.handlebars,内容很简单,如下: <table> <tr> <td>This is {{firstna

js预编译环节 变量声明提升 函数声明整体提升

预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a){ console.log(a) //function a(){} var a = 123; console.log(a)//123 function a(){} console.log(a)//123 var b = function(){} console.log(b) //function()

Js 预编译

开始 所有的测试,都是chrome浏览器. js本身是脚本语言,可以不经过编译直接运行,但是在进入每一个<script>标签,或者js文件的时候,这样的情况下,浏览器会给js一个预编译的过程. 这样就有必要讨论一下预编译了. 解析的状态是首先引入一个代码段,也就是之前提到的标签或者文件.读入整个代码段,进行解析,解析的方式是遇到变量就声明, 对变量声明为undefined,对函数做标记,这个就是预解析,但是如果声明了同名的函数,使用最后一个.变量都是undefied,只有触发的时候,才会激活.

js 预编译环节的变量提升

有些东西需要先告诉你怎么用,再去理解定义 关于变量的提升 function test () { console.log(a) var a = 100 console.log(a) }; test () // undefined // 100 执行步骤 function test () { var a = undefined console.log(a) a = 100 console.log(a) } 关于函数的提升 function test () { console.log(a) funct

javascript运行过程中的“预编译阶段”和“执行阶段”

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行), 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预编译中,javascript对这两种声明做出了两种处理方案 <scri

JS预编译 ---2018.6.22

1.a标签有特点是  在podding和margin情况下不能撑开 2.今天学习了JS的预编译感觉贼迷糊,先听课后面多做练习解决问题: 创建ao对象; 找形参和变量声明,将变量名和形参名作为AO属性名,值为undefined; 将参考值和形参统一; 在函数体里面找函数声明,赋值于函数体. 原文地址:https://www.cnblogs.com/zs-xanadu/p/9215739.html