zoukankan      html  css  js  c++  java
  • 第06课:作用域、JS预解析机制

    从字面上理解----域就是空间、范围、区域,作用就是读、写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作。

     看一下代码

    alert(a);                    // 为什么是undefined
    var a = 1;
    
    alert(a);                    //为什么浏览器无反应
     a = 1;

    要了解为什么这些现象必须先知道浏览器是如何读取js代码,而这段浏览器专门用来读取js代码的片段我们称之为-----js解析器 

    首先,我们来理解“JS解析器”是如何工作的?

    先看如下代码

    alert(a);                    // function a (){ alert(4); }
    var a = 1;
    alert(a);                    // 1
    function fn1(){ alert(2); }

    当“JS解析器”识别到 <script> 它就开始工作了,至少从两个部分开始 

    1)先找一些东西 :根据 var function 参数 先找齐了再开始工作。于是先找到a,但是不会读取a等号后面的东西,所以a是未定义,

                              可以简单理解为 -----所有的变量,在正式运行代码之前,都提前赋了一个值:未定义  a=.......

                              然后根据 function  找到   fn1 = function fn1(){ alert(2); }  

                             所有的函数,在正式运行代码之前,都是整个函数块

                             整体简单理解为:有变量未定义,由函数整个函数整体

                              这一步称之为----------‘js的预解析’

                            原则:遇到重名的------1、只留一个2、变量和函数重名了,就只留下函数                            

    2)逐行读代码 :

    表达式:= + - * / % ++ -- ! 参数……

    表达式可以修改预解析的值!

    如最上面代码当读取到 

    alert(a); 

    先去第一步仓库中找到a未定义 

    于是alert是undefined

    接着才会执行 var a=1;此时a的值才是1

    第二段里面没有var function 参数 所以仓库里面没有东西所以浏览器毫无反应

    案例一:分析如下代码

    alert(a);                    // function a (){ alert(4); }
    var a = 1;
    alert(a);                    // 1
    function a (){ alert(2); }
    alert(a);                    // 1
    var a = 3;        
    alert(a);                    // 3
    function a (){ alert(4); }
    alert(a);                    // 3
    a ()                        // 报错 Uncaught TypeError: number is not a function

    分析过程

    1)预解析    var function 参数
                
                遇到重名的------1、只留一个2、变量和函数重名了,就只留下函数
    
                 最后留下function a (){ alert(4); }  整个集合
    
    2)逐行读代码   所以第一行alert(a); 是集合 function a (){ alert(4); }
    
                   接着给据:表达式可以修改预解析的值!
                   遇到第二行var a = 1;  于是第三行alert(a); 的值是1  
                   第四行无作用不执行
                   于是第五行alert(a); 还是1
                   遇到第六行var a = 3; 于是第七行alert(a); 的值是3
                   第八行无作用不执行
                   于是第九行alert(a); 还是3 
                   第十行a(); 因为此时仓库中只有a=3,而此时在仓库中没有function 所以报错




  • 相关阅读:
    关于 控制反转与依赖注入 对初学者的一点帮助
    转载--文章(感谢米粒儿博主分享) 关于 Json.net序列化时间问题
    转载--文章(感谢陈晨博主分享) 关于 Json.net
    B-JUI框架使用探究
    什么是Entity Framework(ORM)
    字典
    Docker部署Linux+Nginx+Mariadb+PHP环境
    Docker部署Django+nginx+uwsgi环境
    Docker部署Django+apache+mod_wsgi环境
    Docker容器技术
  • 原文地址:https://www.cnblogs.com/eveblog/p/4547035.html
Copyright © 2011-2022 走看看