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

对javascript作用域链的理解相关推荐

  1. JavaScript作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

  2. js作用域及作用域链概念理解及使用

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

  3. 擒贼先擒王,简单谈一下JavaScript作用域链(Scope Chain)

    前言 我们都知道一个执行上下文的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中,同时我们也应该知道变量对象在每次进入上下文时创建并填入初始值,值的更新出现在代码执行阶段.那么咱们专门讨论与 ...

  4. js 执行环境 活动对象 变量对象 作用域链的理解

    看一下是知乎大神对于 js 执行环境 活动对象 变量对象 作用域链的解释 假设在全局环境下定义了函数pub()和变量pubvar: var pubvar = 1; function pub () {v ...

  5. javascript作用域链与原型链有联系吗?

    一般来说,作用域链是针对变量的,js里面大的范围上来说,只有两种作用域,全局作用域和函数内部作用域,如果函数1里面又定义了函数2(一般都是匿名函数), 那么就有了这么一个作用域链全局作用域==> ...

  6. 对作用域、作用域链的理解

    全局作用域和函数作用域 (1)全局作用域 最外层函数和最外层函数外面定义的变量拥有全局作用域 所有未定义直接赋值的变量自动声明为全局作用域 所有window对象的属性拥有全局作用域 全局作用域有很大的 ...

  7. JavaScript原型链的理解

    一.原型链的概念 JavaScript是一门面向对象的编程语言,JavaScript 中的所有事物都是对象,并且对象与对象之间不是彼此独立的,而是有"继承"关系的. 这种" ...

  8. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

    闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...

  9. JavaScript作用域和作用域链详解

    JavaScript作用域链详解 一.JavaScript作用域 JavaScript作用域是什么? 作用域范围 二.JavaScript作用域链 作用域与执行上下文 总结 一.JavaScript作 ...

最新文章

  1. grs matlab公式,[转载]matlab中Max的用法(转)
  2. python快速编程入门第13章-Python快速编程入门,打牢基础必须知道的11个知识点...
  3. PAT (Basic Level) Practise:1017. A除以B
  4. parted如何将磁盘所有空间格式化_CentOS下大于2T的硬盘格式化问题
  5. weblogic自带的jdk是在工程的包部署后编译使用
  6. HDU 1518 Square
  7. 百度单测生成技术如何召回线上服务的异常问题?
  8. A1075.PAT Judge
  9. 【C语言进阶深度学习记录】二十三 数组的本质分析
  10. C# + OpenCvSharp实现仿射变换
  11. layui table异步调用数据的时候,数据展示不出来现象解决方案
  12. python-类继承多态
  13. 三菱plc pwm指令_三菱plc功能指令集大全和自学基础
  14. 【STC单片机】STC15单片机读取MPU6050模块数据并串口输出
  15. 无线 WIFI 的13个信道频率范围
  16. VC++ 中主线程等待子线程结束的方法
  17. 让学前端不再害怕英语单词(四)
  18. 在xml中定义excel的sheet_XML和Excel
  19. Illustrator CC 2019 Essential Training Illustrator CC 2019基础教程 Lynda课程中文字幕
  20. 二胎妈妈的前端逆袭之路

热门文章

  1. 磁盘阵列RAID的分类有哪些?
  2. TCP快速重传为什么是三次冗余ack,这个三次是怎么定下来的?
  3. 互联网协议 — IPSec 安全隧道协议 — NAT-T
  4. KVM — 内存虚拟化
  5. 数据中心网络架构 — CLOS 网络架构的起源于发展
  6. springcloud使用pagehelper 实现分页,及total 数据问题
  7. vue-router学习笔记(一)
  8. vuex 基本入门和使用(二)
  9. Windows通过VNC访问Kylin桌面环境
  10. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解