• 作用域链


    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <script>
        1 var a = 1;
        2function fn1(){
         3        alert(a);                        // undefined
         4        var a = 2;
            5   }
        6 fn1();
         7 alert(a);                            // 1
    //    先预解析,从上到下找带有var function的关键参数
    //    先找一遍预解析:
    //    1、找到第一行a=...并没有赋值,且说未定义undefined
    //    2、找到函数
    //    function fn1(){
    //        alert(a);
    //        var a = 2;
    //    }
    //     3、找完所有的var function 之后开始解读代码:
    //     4、从头开始读到var a=1表达式;并将找到的a=1交给与解析的a
    //    4、遇到函数调用、在fn1函数内又开始预解析、找带有var function的关键参数
    //        找到var a=2;解析成a=...局部内的与解析结束了
    //     alert(a)开始找a,之前已经找到a=...未定义undefined 函数内部的之后在你逐句解读代码
    //     原来的a=1变成了a=2;(垃圾回收)
    //        这次找到的a=...替换原来的a...因此fn1()函数内alert(a)为undefined
    //    5、第七行的alert(a)逐句解读代码,找到a=1因此弹出a
    </script>
    </body>
    </html>
    
    

     

     
    
    
    var a = 1;
    function fn1(){
        alert(a);                        // 1
        a = 2;
    }
    fn1();
    alert(a);                            // 2
    1 var a = 1;
    2 function fn1(a){
    3     alert(a);                        // undefined
    4     a = 2;
    5 }
    6 fn1();
    7 alert(a);                            // 1
    var a = 1;
    function fn1(a){               //a相当于var a
        alert(a);                        // 1
        a = 2;
    }
    fn1(a);
    alert(a);                            // 1

     

    1)“先找一些东西”  :var  function 参数

    a = ...
    所有的变量,在正式运行代码之前,都提前赋了一个值:未定义
    fn1 = function fn1(){ alert(2); }
    所有的函数,在正式运行代码之前,都是整个函数块

    JS 的预解析

    遇到重名的:只留一个
    变量和函数重名了,就只留下函数
    2)逐行解读代码:
    表达式:= + - * / % ++ -- ! 参数……
    表达式可以修改预解析的值!

  • 相关阅读:
    生成类似于MongoDB产生的ObjectId
    链式编程:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)
    mysql时间字符串按年/月/天/时分组查询 -- date_format
    根据模板导出excel
    九度 1188 约瑟夫环问题
    快速排序
    Linux 命令
    volatile小记
    线程池ThreadPoolExecutor
    CyclicBarrier、CountDownLatch与Semaphore的小记
  • 原文地址:https://www.cnblogs.com/nifengs/p/4954369.html
Copyright © 2020-2023  润新知