`
SteveJoX
  • 浏览: 2491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

js的作用域链

阅读更多

这几天学习了一下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对象的属性和方法创建的,某个执行环境中的所有 代码执行完毕后该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境知道应用程序退出-----例如关闭浏览器或者网页时才会销 毁!!!

1
6
分享到:
评论

相关推荐

    javascript作用域链(Scope Chain)初探.docx

    javascript作用域链(Scope Chain)初探.docx

    js作用域链图解ppt

    作用域链图解

    scope-chains-closures, Javascript作用域链和闭包 workshop.zip

    scope-chains-closures, Javascript作用域链和闭包 workshop 范围链和闭包 workshop正在启动$ npm install -g scope-chains-closures$ scope-chains-closures # or, shorter: sccjs使用箭头

    图解javascript作用域链

    先来一段简单的javascript代码: ...1.javascript引擎会在页面加载脚本被执行时为每个函数创建一个作用域(执行上下文)及作用域链。 2.javascript引擎在产生这些作用域后,会创建一个堆栈。 3.将onload对应的

    理解JavaScript作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...

    深入理解JavaScript作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ...

    javascript作用域链(Scope Chain)用法实例解析

    主要介绍了javascript作用域链(Scope Chain)用法,结合实例形式较为详细的分析了javascript作用域链(Scope Chain)的概念、功能与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    浅析JavaScript作用域链、执行上下文与闭包

    JavaScript 采用词法作用域(lexical scoping),函数执行依赖的变量作用域是由函数定义的时候决定,而不是函数执行的时候决定,通过本文给大家介绍JavaScript作用域链、执行上下文与闭包相关知识,感兴趣的朋友一起...

    JavaScript 作用域 和作用域链

    JavaScript 作用域 和作用域链作用域作用域链 作用域 作用域就是变量与函数的可访问范围,作用域控制着变量与函数的可见性和生命周期。换句话说,作用域决定了代码区块中变量和其他资源的可见性。 function fun() { ...

    JavaScript作用域链实例详解

    本文实例讲述了JavaScript作用域链。分享给大家供大家参考,具体如下: 跟其他语言一样,变量和函数的作用域揭示了这些变量和函数的搜索路径。对于JavaScript而言,理解作用域更加重要,因为在JavaScript中,作用域...

    JS作用域链详解

    本文实例为大家分享了JS作用域链的相关内容,供大家参考,具体内容如下 1、所有全局变量和函数都是作为window对象的属性和方法创建的。 2、在某个方法函数的作用域中,所有代码执行完之后,该作用域被销毁,保存在...

    JavaScript作用域链示例分享

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。

    JS 作用域与作用域链详解

    1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(function scope),属于局部变量 局部变量...

    【JavaScript源代码】JS难点同步异步和作用域与闭包及原型和原型链详解.docx

     目录 JS三座大山同步异步同步异步区别作用域、闭包函数作用域链块作用域闭包闭包解决用var导致下标错误的问题投票机闭包两个面试题原型、原型链原型对象原型链完整原型链图 JS三座大山 同步异步同步异步区别...

    关于Javascript作用域链的八点总结

    1. JavaScript函数的作用域链分为定义时作用域链和运行时作用域链; 2.函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的定义时作用域链[[scope]]...

    Javascript作用域和作用域链原理解析

    作用域和作用域链在Javascript和很多其它的编程语言中都是一种基础概念。但很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。 正确的去理解这个概念有利于你去写更好,更高效和更简洁的...

Global site tag (gtag.js) - Google Analytics