javascript预编译机制

预编译的两种情况
全局:

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

console.log(test); ---->   **输出函数体**
 function test(test){
     console.log('test='+test); ----> **输出undefined**
      var test = 123;
 }
test();

例2

console.log(test); ---->   输出函数体
 function test(test){
     console.log('test='+test); ----> *输出10*
      var test = 123;
 }
test(10);
1.4 分析函数声明,函数名为属性名,值为函数体,如果遇到AO对象上属性同名,则无情覆盖
  1. 逐行执行

总之:不管全局还是局部,都是先预解析声明变量,其次是声明函数。
需注意的就是:
当解析函数声明时与变量同名则无情覆盖。
函数内的形参与变量同名,以形参为准;
赋值函数(即变量=一个匿名函数)是属于变量声明;

综合练习例子

<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>

参考
https://www.cnblogs.com/xuxiaoyu/p/10133373.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,142评论 0 5
  • 来源:仗剑走天涯! 关于javascript的作用域的一些总结,主要参考以上文章,加上自己的整理的理解。 近日对j...
    Michael_林阅读 4,490评论 0 1
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,124评论 0 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,803评论 1 32
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 4,844评论 0 1