JS做用域理解(声明提高)

1.JS解析步骤:函数

  a.预解析spa

    将变量声明提高;firefox

    将函数声明及函数内容提高,能够理解成原来位置的函数在解析代码时已经提到代码初始位置;队列

    块内的变量声明和函数声明也会被提高,例如if语句事件

    遇到重名,只留下一个;ip

    若有重名变量和函数,留下函数;作用域

    若有两个重名函数,后一个函数覆盖前一个函数;get

    firefox不能预解析块内定义的函数,出于兼容性考虑,定义函数,通常要放到最外面input

    (注意:变量提高的是声明,函数提高的是声明和内容)io

  b.逐行解析代码

    遇到表达式,能够修改预解析的变量值,例如变量赋值能够将函数声明替换掉;

    (重点)先处理js代码,再处理代码中的事件和队列,例如,先将setTimeout解析出来,等代码执行完,再根据延时处理其中的函数

2.若是有几个script代码部分,JS会按照前后顺序逐个解析执行,可是这几个代码部分共用一个域

3.函数的参数至关于在函数内部定义了这个变量,至关于局部变量,在函数内部解析时也会进行声明提高

4.JS中,每一个函数都有本身的执行环境(做用域),其中使用的变量会按照做用域链进行搜索,一直到全局环境,而且只会对目标变量所处的环境形成影响

5.被花括号包围的代码块在不少类c语言中会有块级做用域,JS没有块级做用域

6.函数传参至关于赋值表达式

7.只要是一个执行环境(做用域),就会发生JS解析两个步骤

8.只有函数能够建立局部做用域,若是须要一个相似块级做用域的做用域,能够在块内加入一个函数

  例子:

    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    

    alert( typeof a );

    a(); // 报错

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    <script>

      alert(a);        //报错

    </script>

      <script>

      var a=1;

    </script>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    <script>

      var a=1       

    </script>

      <script>

      alert(a);   //1

    </script>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

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

    window.onload = function (){     var aBtn = document.getElementsByTagName('input');     for( var i=0; i<aBtn.length; i++ ){     aBtn[i].onclick = function (){     // alert( i ); // Undefined     for( var i=0; i<aBtn.length; i++ ){     aBtn[i].style.background = 'yellow';     }     };     }    };

相关文章
相关标签/搜索