zoukankan      html  css  js  c++  java
  • JS作用域解析

    	浏览器:
    		“JS解析器”
    			1)JS 的预解析,“找3样东西,变量,函数,参数”	:var  function 参数
    			
    							a = undefined
    									所有的变量,在正式运行代码之前,都提前赋了一个值:undefined未定义
    							fn1 = function fn1(){ alert(2); }
    									所有的函数,在正式运行代码之前,都是整个函数块
    						遇到重名的:只留一个
    							变量和函数重名了,就只留下函数
    									
    			2)逐行解读代码:
    						表达式:= + - * / % ++ -- ! 参数……
    						
    						什么是表达式? 答:可以修改预解析的值!
    

      

    总结:域由两部分组成,script域和function域,先预解析后逐步执行代码.预解析:找var和function! 

     两大特征: 自上而下,自内而外; 表达式能够改变仓库中的值; 

    0.

    <script>
        alert(a); //undefined
        var a = 10;
    </script>
    //**********************
    //浏览器没反应,F12显示 "a is not defined"
    <script>
        alert(a); 
        a = 10;
    </script>
    

    0.1

    <script>
        alert(a); // function a(){}
        var a = 1;
        alert(a); //1
        function a(){
            alert(4)
        }
        alert(a) //1
    </script>
    

    0.2 执行到第一行代码的时候先执行的js预解析,发现有var a变量的和函数 a,因为重名只能留一个,函数优先级别高于变量和参数,所以是留下的是函数a,再往下解析凡是遇到变量直接ko掉直到遇到最后一个函数,后面的函数会覆盖前面的函数!所以第一行 打印的是function a(){alert (4)}; 预解析好之后是逐步执行代码,有加减乘除等就能改变预解析的值,所以a在不断的被改变!本题中的函数都没有被调用,可以被忽视,如果调用了那么函数有自己的作用域,也要重新做预解析和逐步执行代码

    <script>
        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(); //等价于3(),报错是"a is not a function"
    </script>
    

      

      

      

    1.

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

    2.

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

    3. 

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

    4. 当在fn1域中,找不到var和新的函数,那么就会往它的父级作用域去找,找到了,弹出1;当遇到表达式a=2,更改了a的值!

    <script>
        var a = 1;
        function fn1(){
            alert(a);
            a = 2;
        }
        fn1(); //1 自内而外
        alert(a); //2,局部修改全局
    </script>
    

    5. 注意 函数的形参等于局部变量

    <script>
        var a = 1;
        function fn1(a){ //等于var a
            alert(a);
            a = 2;
        }
        fn1(); //undefined 
        alert(a); //1
    </script>
    

    6.当遇到函数的调用的时候,形参a读到是全局变量var a =1; 传过去的时候变成了函数的局部变量,a = 2;改变的是函数作用域的局部变量a,与全部变量的a没一分钱的关系

    <script>
        var a = 1;
        function fn1(a){
            alert(a);
            a = 2;
        }
        fn1(a); //1
        alert(a); //1
    </script>
    

      

      

      

      

      

      

  • 相关阅读:
    Trie树详解及其应用
    最长回文字符串_Manacher算法_(O(n))
    设置VisualStudio以管理员身份运行
    wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法
    data:image字符转byte[]
    ID为XXXX的进程当前未运行
    在Windows2003 server 64位系统上使用ArcEngine开发的WCF服务
    关于position的relative和absolute分别是相对于谁进行定位的
    sql语句进行写数据库时,字符串含有'的处理方式
    EF中关于日期字值的处理
  • 原文地址:https://www.cnblogs.com/bravolove/p/5928298.html
Copyright © 2011-2022 走看看