对javascript作用域链的理解

这几天学习了一下javascript作用域链,感到这个挺重要的,所以写一篇文章分享一下:


1. 作用域链:

                     当代码在一个环境中执行时,会创建由变量对象构成的一个作用域链。作用域链的用途是:保证对执行环境有权访问的搜友变量和函数的有序访问。

2. 在作用域链中查找标识符:

                    当在某环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。搜索过程将一直追溯到全局环境的变量对象。如果在全局环境中也没有找到这个标识符,则意味着这个标识符为声明。


3.  现在就来看看例子吧。。。


3.1    var name = "hello";

 
       function  test(){
         alert(name);  //undefined
         var  name =  "world" ;
         alert(name);   //world
      }
      test();

分析:  首先函数test()的作用域链包含两个对象:他自己的变量对象和全局的变量对象。在全局变量对象(即就是Window对象)中存在name=“hello”和Window对象自身所持有的一些睡醒,全局作用域被放在作用域链的最末端。现在来说说test自身的变量对象,有alert,name,alert这三个变量,因为test函数还没有执行所以此时的name属性的值就是undefined,因此当解析到 alert(name);  //undefined这一句话的时候,js引擎会在自身的对象作用域中找到name属性,并且输出他的值(undefined),当执行到 var  name =  "world" ;时name属性的值已经被赋值为world了因此下一条alert就打印出world了!


3.2    var name = "hello";

 
         function  test(){
             alert(name);    //hello
             name =  "world" ;
             alert(name);    //world
         }
 
         test();
分析: 此时也和上面的一样,都有两个作用域对象,Window作用域对象和上面分析的一样(name=hello),现在来分析分析test的作用域:因为在js中存在预编译的过程,即就是:js在执行每一段js代码之前,都会首先处理var关键字和function定义式。但因为此时的test内部没有var生命的变量,所以此时name属性没有在test这个作用域里面,这里要说一句:在使用var关键字声明的变量时,这个变量将被自动添加到距离最近的可用环境中,对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的时候被初始化,那么该变量会自动被添加到全局环境。因此name现在已经被为全局作用域对象中的属性了。但是其值依旧还是hello,因为还没有执行到 name =  "world" ;因此当第一条 alert(name);    //hello时候会在全局环境变量中查找到hello的值,当执行了   name =  "world" ;全局变量中的name就被赋值为world了,因此在进行 alert(name);    //world的时候就是world了。


3.3   name = "hello";

 
         function  test(){
             alert(name);   //undefined    ---》》》在自己的作用域中查找到的
             var  name =  "world" ;        
             alert(name);   //world
         }
 
         test();
 
         name =  "hello" ;
 
         function  test(){
             alert(name);     //hello
             name =  "world" ;
             alert(name);     //world
         }
         test();
接下来这两种情况出现的值就很好分析了。。。


补充::奥 对了,还有一点要补充一下:

                                                                      在web浏览器中,全局执行环境被认为是Window对象,因此所有的全局变量和函数都是作为Window对象的属性和方法创建的,某个执行环境中的所有代码执行完毕后该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境知道应用程序退出-----例如关闭浏览器或者网页时才会销毁!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值