本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事。本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿。
再说明之前,咱们先用简单的语言来概括一下这两个的区别。
00 上下文环境:
可以理解为一个看不见摸不着的对象(有若干个属性),虽然看不见摸不着,但确实实实在在存在的,因为所有的变量都在里面存储着,要不然咱们定义的变量在哪里存?
另外,对于函数来说,上下文环境是在调用时创建的,这个很好理解。拿参数做例子,你不调用函数,我哪儿知道你要给我传什么参数?
01 作用域:
首先,它很抽象。第二,记住一句话:除了全局作用域,只有函数才能创建作用域。创建一个函数就创建了一个作用域,无论你调用不调用,函数只要创建了,它就有独立的作用域,就有自己的一个“地盘”。
02 两者:
一个作用域下可能包含若干个上下文环境。有可能从来没有过上下文环境(函数从来就没有被调用过);有可能有过,现在函数被调用完毕后,上下文环境被销毁了;有可能同时存在一个或多个(闭包)。
上面的文字不理解没关系,且看下面的例子。
第一,除了全局作用域外,每个函数都要创建一个作用域。作用域之间的变量是相互独立的。因此,全局作用域中的x和fn作用域中的x,两者毫无关系,互不影响,和平相处。

第二,程序执行之前,会生成全局上下文环境,并在程序执行时,对其中的变量赋值。

第三,程序执行到第17行,调用fn(5),会产生fn(5)的上下文环境,并压栈,并设置为活动状态。

第四,执行完第17行,fn(5)的返回值赋值给了f1。此时执行上下文环境又重新回到全局,但是fn(5)的上下文环境不能就此销毁,因为其中有闭包的引用(可翻看前面文章,此处不再赘述)。

第五,继续执行第18行,再次调用fn函数——fn(10)。产生fn(5)的上下文环境,并压栈,并设置为活动状态。但是此时fn(5)的上下文环境还在内存中——一个作用域下同时存在两个上下文环境。

讲到这里,重点已经讲出来了,之后的场景这里就不再赘述了。

目的还是希望大家能通过这个例子,来理清楚上下文环境和作用域的关系。当然,也不是非得像个学院派似的一字一文的把概念说出来,简单理解一下,对用闭包是有帮助的。

深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系相关推荐

  1. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  2. 深入理解javascript原型和闭包(12)——简介【作用域】

    提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:"javascript没有块级作用域".所谓"块",就是大括号"{}"中间的语句. ...

  3. 深入理解javascript原型和闭包(17)——补this

    本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...

  4. 深入理解javascript原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...

  5. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  6. 深入理解javascript原型和闭包(15)——闭包

    前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于"闭包"这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知 ...

  7. 深入理解javascript原型和闭包

    原文链接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 对象是属性的集合. function show(x) {console.log(typ ...

  8. 深入理解javascript原型和闭包(8)——简述【执行上下文】上

    什么是"执行上下文"(也叫做"执行上下文环境")?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览 ...

  9. 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 上文简单介绍了作用域,本文把作用域和上下文环境结合起来说一下,会理解的更深一些. 如上图,我们在上文中已经介绍了 ...

最新文章

  1. 创业还需要开发 App 么?
  2. angularjs1访问子组件_vue 组件通信看这篇就够了(12种通信方式)
  3. 【深度学习】重新思考BatchNorm中的 “Batch”
  4. 五、性能监视(2)Windows性能日志
  5. SAP CRM Attachment read - performance issue
  6. 深入浅出Dotnet Core的项目结构变化
  7. 对10亿个数据去重java_20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap...
  8. java api math_JAVA 函数 Math API
  9. 【转载】SQL 标量函数-----字符串函数 之二 去空格函数 LTRIM() 、RTRIM()
  10. 有关parent.frame.cols在firefox浏览器上不兼容的问题解决
  11. 关于银行项目的软件测试_关于软件测试
  12. strcmp()函数
  13. 关于 nektar 连接电脑使用的一些问题说明, nektar Impact GX61/GX49/SE25
  14. 蚁群算法Python实现
  15. 数据一致性(CAP原则)
  16. methodsignature java_Java MethodSignature.getMethod方法代碼示例
  17. java怎么计算时间差_请问java怎么计算时间差
  18. 3D建模软件应该学中文版还是英文版?Maya软件应该学中文版还是英文版?
  19. 精彩推荐 | 金秋十月不容错过的技术演讲(上)
  20. 铁电存储器F-RAM

热门文章

  1. jquery获取一个table中的一行的每个td的内容
  2. 浅析Java中对象的创建与对象的数据类型转换
  3. B+Tree索引为什么可以支持千万级别数据量的查找——讲讲mysql索引的底层数据结构
  4. 如何解决python爬虫requests.get()遇到的418问题
  5. Python处理千万级数据
  6. Redis内部数据结构详解之简单动态字符串(sds)
  7. CGI模式,模块模式与CLI模式运行PHP的区别
  8. 8086汇编4位bcd码_51单片机用汇编语言实现BCD码转换
  9. 贵州师范学院数学与计算机科学,贵州师范学院数学与计算机科学学院
  10. 赶集网MySQL开发36军规