预编译的两种情况

全局:

1.全局 直接是script标签中的代码,不包括函数执行
执行前:
1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析
2.分析变量声明,变量名为属性名,值为undefined
3.分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖

函数内部:

1.函数调用,也是会生成自己的作用域(AO:active object),AO活动对象. 函数调用时候,执行前的一瞬间产生的,如果有多个函数的调用,会产生多个AO

1.1 函数执行前的一瞬间,生成AO活动对象

1.2 分析参数,形参作为对象的属性名,实参作为对象的属性值

1.3 分析变量声明,变量名为属性名,值为undefined,如果遇到AO对象上属性同名,不去做任何改变

1.4 分析<b>函数声明</b>,函数名为属性名,值为函数体,如果遇到AO对象上属性同名,则无情覆盖

2.逐行执行

举例时间:

简单版本-全局:

<script type="text/javascript">
console.log(a);//a函数函数体
var a=10;
function a(){ }
</script>

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

GO{

}

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

GO{

  a:underfined

}
3.分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖

GO{

  a:function a(){

  }

}

接下来就是执行代码,console.log输出a函数的函数体

简单版本-局部1:

<script type="text/javascript">
function fun(test){
console.log(test);//5
var test = 10;
console.log(test);//10
}
fun(5);
</script>

1.函数执行前的一瞬间,生成AO活动对象

AO{

}
2.分析参数,形参作为对象的属性名,实参作为对象的属性值

AO{

  test:5;

}

3. 分析变量声明,变量名为属性名,值为undefined,如果遇到AO对象上属性同名,不去做任何改变

AO{

  test:5;

}

接下来执行代码,第一个console.log输出AO里test的值,

第二个console.log输出上面一行赋值为10过后的值,为10

简单版本-局部2:

<script type="text/javascript">
function fun(test){
console.log(test);//test函数体
var test = 10;//给test赋值为10
function test(){//声明函数 }
console.log(test);//10
}
fun(5);
</script>

1.函数执行前的一瞬间,生成AO活动对象

AO{

}
2.分析参数,形参作为对象的属性名,实参作为对象的属性值

AO{

  test:5;

}

3. 分析变量声明,变量名为属性名,值为undefined,如果遇到AO对象上属性同名,不去做任何改变

AO{

  test:5;

}

4. 分析函数声明,函数名为属性名,值为函数体,如果遇到AO对象上属性同名,则无情覆盖

AO{

  test:function(){};

}

5.逐行执行

然后开始一行一行执行代码,第一个console.log输出的结果是test的函数体

下一行就是给test赋值为5,

下一行就是函数体的声明,不做处理

下一行就是console.log输出的结果就是10

复杂版本:

 <script type="text/javascript">
console.log(test);
function test(test){
console.log(test);
var test = 123;
console.log(test);
function test(){ }
console.log(test);
var test = function(){}
console.log(test);
}
test(10);
var test = 456
console.log(test);
</script>

预编译开始,先生成一个GO{

}

1.看变量GO{

  test:underfined

}

2.看函数声明GO{

  test:function test(test){

      console.log(test);
      var test = 123;
      console.log(test);
      function test(){

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

 }

把整个函数体给test

预编译完成,开始执行代码,第二行的结果是test函数的函数体

3到13行都是函数声明,不用管

第14行函数执行,传入参数10

函数执行的时候产生AO{

}

1.看参数AO{

  test:10

}

2.看变量,变量同名,不用管变量AO{

  test:10

}

3.看函数,函数和参数同名,函数把参数覆盖AO{

  test:function test(){}

}

4.逐行执行

第三行打印名字为test的函数体,

第四行给test赋值123,第五行打印123

7到9行函数体声明不用管

第十行打印123

第十一行把一个匿名函数(没有函数名的函数)赋值给test

第十二行函数执行完毕

第十四行回到全局,把456赋值给test

第十五行打印456

效果图:

JS之预编译和执行顺序(全局和函数)的更多相关文章

  1. JS的预编译和执行顺序 详析

    原文:JS的预编译和执行顺序 详析 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题   代码:   复制代码 代码一 <ht ...

  2. JS的预编译和执行顺序 详析(及全局与局部变量)

    最近在复习javascript的事件处理时发现了一个问题,于是总结一下:javascript的预编译和执行顺序的问题:   <html> <head> <title> ...

  3. JS 的预编译和执行顺序

    脚本执行js引擎做的工作: 语法分析 预编译 解释执行

  4. javascript的预编译和执行顺序

    原文:javascript的预编译和执行顺序 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 代码一<html> ...

  5. 关于JavaScript预编译和执行顺序以及函数引用类型的思考

    昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...

  6. [js]js代码执行顺序/全局&私有变量/作用域链/闭包

    js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...

  7. js 变量、函数提升 与js的预编译有关

    参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = ...

  8. js的预编译机制

    1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错) 2.js的预编辑:[对定义式函数]直接创建为作用域上的函数变 ...

  9. wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)

    初学wex5,先理理让人容易混淆的三个概念: 一 基本概念: 1 wex5组件,顾名思义,在编辑窗口右侧的组件集合里的,都是wex5基于开源自创的组件,并封装了一套自已的方法.目的是为了方便.相关方法 ...

随机推荐

  1. 处理Oracle 11g在用EXP导出时,空表不能导出

    一.问题原因:     11G中有个新特性,当表无数据时,不分配segment,以节省空间 想要给空表也分配segmant,有以下两个办法: 1.insert一行,再rollback就产生segmen ...

  2. [Webpack + React] Import CSS Modules with TypeScript and webpack

    If you try to use CSS Modules in TypeScript the same way you would use them in JavaScript, with webp ...

  3. 数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

    高斯滤波就是对整幅图像进行加权平均的过程.每个像素点的值,都由其本身和邻域内的其它像素值经过加权平均后得到.高斯滤波的详细操作是:用一个模板(或称卷积.掩模)扫描图像中的每个像素.用模板确定的邻域内像 ...

  4. hdu5249 Tricks Device(网络流最大匹配)

    分析题意可知: 1.最少须要切断多少边使吴不能找到张(题意吴仅仅能走最短路径上面的边),对从起点到终点的最短路径又一次建图,每条边的权值为1.求最大流就可以 2.在吴能够找到张的前提下,最多能够切断边 ...

  5. poj_2187求凸包直径

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...

  6. js 实现 水仙花数

    水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) <!DOCTYPE html><html ...

  7. 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

    六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...

  8. PostgreSQL Replication之第三章 理解即时恢复(1)

    到现在为止,您已经掌握了一定的理论.因为生活不仅由理论组成(它可能同样重要),是时候深入实际的工作了. 本章的目标是让您明白如何恢复数据到一个给定的时间点.当您的系统崩溃或者有人意外地删除了一个表,不 ...

  9. Spring:dispatchservlet

    DispatcherServlet 是 Spring MVC 中负责请求调度的核心引擎,所有的请求将由此 Servlet 根据配置分发至各个逻辑处理单元.其内部同时也维护了一个ApplicationC ...

  10. MNIST手写数字数据集

    下载python源代码之后,使用: import input_data mnist = input_data.read_data_sets('MNIST_data/',one_hot=True) 下载 ...