执行环境及作用域

1. 变量:

         基本类型和引用类型的值:

                  可以直接操作保存在基本数据类型变量中的值-----基本数据类型值在内存中占据固定大小的空间,因此保存在栈中

                  操作引用数据类型,实际上是操作对象的引用,而不是直接操作内存对象(因为JS不允许直接访问内存中的位置),引用数据类型的值实际上是放在内存中的对象。-----但是给对象添加属性,是操作的内存中的对象,复制保存对象的某个变量时,操作的是引用。-----引用数据类型的值是对象,保存在堆中

         复制变量的值:

                 引用数据类型的值复制时,复制的是引用

2. 检测对象是哪种类型的对象:variable  instanceof  constructor

3. 执行环境----每个执行环境都有一个与之关联的变量对象,该环境中定义的所有变量和函数都保存在这个变量对象中

         ① 全局执行环境:最外围的一个执行环境,被认为是window对象,所有的全局变量和函数都做为window对象的属性和方法被创建。当某个执行环境中的所有代码都执行完毕后(应用程序退出或者网页关闭或浏览器关闭等),该环境就会被销毁,随之变量和函数也被销毁。

         ② 函数的执行环境:每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行完毕后,栈将其环境弹出。

4. 作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。其作用是,保证对执行环境有权访问的所有变量和函数有序访问。

           作用域链的前端,始终是当前执行代码所在环境的变量对象,如果这个环境是函数,则将其活动对象作为变量对象。活动对象最开始只包含一个变量,即arguments对象,作用域链中的下一个变量对象来自包含(外部)环境,再下一个来自下一个包含环境。。。。。一直持续到全局执行环境(始终是作用域链中的最后一个对象)

5. 标识符(变量、函数、属性、函数参数的名字)解析是沿着作用域链一级一级的搜索标识符的过程。从标识符的前端逐级向后溯。

        如:

              var color = "blue";

              function changeColor() {

                    if(color === "blue"){

                            color = "red";

                    }else {

                            color = "blue";

                    }

              }

              changeColor();

         在函数changeColor() 的作用域链中包含两个对象:他自己的变量对象arguement对象和全局环境变量对象。该函数可以访问到color变量,就是因为可以在这个作用域链中找到他。

         在局部环境中定义的变量可以在局部环境中与全局变量互换使用,如:

         var color = "blue";

         function changeColor() {

                  var anotherColor = "red";

                   function swapColors() {

                          var tempColor = anotherColor;

                          anotherColor = color;

                          color = tempColor;

                      //这里可以访问到tempColor  anotherColor  color  作用域链为swapColors的变量对象---changeColor()的变量对象---全局变量对象。

                   }

              //这里可以访问到anotherColor  color  作用域链为changeColor的变量对象---全局变量对象

         }

6. 延长作用域链:当执行流进入catch 或 with 语句时,可以在作用域的前端临时增加一个变量对象,这个对象会在代码执行后被移除。-----即延长作用域链。

        对于with语句来说,会将指定对象添加到作用域链中。

        如:

               function buildUrl() {

                            var qs = "?debug=true";

                            with(location) {

                                      var url = href +qs;

                             }

                             return url;

                }

          这里,location为临时变量对象,添加到作用域链的前端,所以在外可以访问到url。

7. 不存在块级作用域

          for(var i = 0;i<10;i++){

                  doSomething(i);

          }

          alert(i);  //这里i虽然在for语句的括号内声明,但依旧存在于循环外部的执行环境中。

          使用var声明的变量会自动被添加到最接近的执行环境中,若在函数中声明,则添加到函数的局部环境中,在with语句中,最接近的环境是函数环境。

          如果初始化的变量没有用var声明,则该变量被添加到全局环境window对象中。

8. 查询标识符

          当某个环境为了读取或写入而引用一个标识符时,会搜索该标识符的意义。搜索首先从该局部环境中进行,即作用域链的最前端,如果没有则向上搜索,直至找到该标识符。

          注意:如果在局部环境中已经存在了某个变量了,就不会再向上搜索。

          如:(在这个函数中,如果不使用window.color,就不会访问到全局的color对象)

               var color = "red";

               function getColor(){

                       var color = "blue";

                       return color;     //blue    首先搜索getColor()的变量对象,查找是否含有color。

               } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值