JavaScript【函数预编译和作用域链问题】

函数预编译

    JavaScript代码执行的时候会产生一个全局的执行期上下文对象GO{}(即global object)

         执行期上下文形成过程:

                 1、创建GO{}

                 2、在全局中查找变量声明和函数声明并且其值为undefined,若函数名和变量名相同即为GO对象的同一个属性

                 3、将函数赋值给对应的变量名

        而在每一个函数执行的前一刻都有一个全新的执行期上下文对象AO{}(即active object)

                 1、创建AO{}

                 2、在全局中查找变量声明和函数声明并且其值为undefined,若函数名和变量名相同即为GO对象的同一个属性

                 3、将函数的参数赋值给对应的变量名                 

                 4、将函数赋值给对应的变量名

作用域链 

       每一个函数都有一个自己的作用域链。作用域链就是由执行期上下文生成的一个链,自己的AO{}存在于作用域的最顶端,依次是GO{},此处GO是一个相对的概念。例: 

<script>

function fun(){

      var a = b = 0;

      function fun1(){

           console.log(b);

       }

}

</script>

如上述的函数:  fun()函数在执行的时候会生成一个自己的执行期上下文

AO{

      a: 0, 

      fun1:functon(){

       console.log(b);

}

}

而内层函数fun1()执行的时候也会生成一个自己执行期上下文对象

AO{ }

因为该函数里面既没有变量声明也没有函数声明,因此该对象为一个空对象。

但是在执行函数的时候会涉及b这个变量,它会先去找自己的AO{},但是并没有,于是去GO{}去找,这是它的GO{} 相当于就是外层函数得到的AO{}+全局的GO{},而外层函数AO{}中也没有b这个属性,于是去GO{}里找到b。 这个时候就形成了一条所谓的作用域链。

而fun1()作用域链最顶端就是自己的AO{},其次是外层原函数fun()函数的AO{},最后是全局的GO{},函数执行的环境就是在这个作用域链上。

猜你喜欢

转载自blog.csdn.net/qq_41934908/article/details/81102291