zoukankan      html  css  js  c++  java
  • javascript函数执行前期变量环境初始化过程

    示例代码如下:
    var d = '全局的';
    (function(){
     alert(d == undefined);//结合步骤4
     var d = 123;
    })();
    (function(a){
     var a;
     alert(a == 123);//结合步骤1,4;
    })(123);
    (function(){
     alert(typeof a == 'function');//结合步骤2,4;
     function a(){}  //这句换下面,结果还是一样
     var a = 234;
    })();
    (function(){
     alert(typeof a == 'function');//结合步骤2,4
     var a = 234;//这里赋值是在函数初始化完成后执行阶段完成的,因此下面a的类型变成了number
     alert(typeof a == 'number');//并没有违反步骤2,4规则,由于这是在执行期间判断的,上面的逻辑已经将a改变了
     function a(){}
    })();

    函数执行前期初始化变量环境走了如下过程:
    1、遍历参数列表,添加到函数变量环境并赋值。
    2、遍历函数声明,如果函数变量环境中存在则赋值,不存在则添加并赋值。
    3、添加arguments并赋值【这里不同浏览器表现差异较大,并不一定都是这样】
    4、遍历函数中所有的变量声明,如果变量环境中存在则不作任何操作,不存在则添加并赋值undefined。
    这四个步骤完成后,函数才开始真正执行相关逻辑,所有的赋值语句才开始从上往下生效。
     
    手打累了,不打了,看到这里应该也明白了函数声明提前问题了
  • 相关阅读:
    Springboot 中AOP的使用
    ElasticSearch 聚合查询百分比
    ElasticSearch 入门
    elasticsearch 关联查询
    spring data elasticsearch多索引查询
    elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词
    es同步mysql同步-logstash
    jpa Specification复杂查询
    java Spring boot使用spring反射
    BeautifulSoup学习记录
  • 原文地址:https://www.cnblogs.com/huzhiming/p/2806849.html
Copyright © 2011-2022 走看看