搜索
简帛阁>技术文章>深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系

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

本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事。本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿。

 

再说明之前,咱们先用简单的语言来概括一下这两个的区别。

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原型和闭包系列》的目录,更多内容可参见《深入理解javascript原型和闭包系列》。

另外,欢迎关注我的微博。

学习作者教程:《前端JS高级面试》《前端JS基础面试题》《React.js模拟大众点评webapp》《zepto设计与源码分析》《json2.js源码解读》

上文(理解javascript原型作用系列(1一切都是对象已经提到,函数就是对象一种,因为通过instanceof函数可以判断。varfnfunction(){};consolelog(
续上一篇文章(http://wwwcnblogscom/wangfupeng1988/p/3986420html内容。上一篇我们讲到在全局环境代码段中,执行上下文环境中有如何数据:变量、函数
理解前置知识点点前言在JavaScript中的”神兽“,很多同学会觉得闭包这玩意太恶心了,怎么着都理解不了其实刚接触JavaScript时候我也是这样。But,闭包真非常重要!非常重要!非常
前面提到上下文环境作用知识,除了了解这些知识之外,还是理解基础。至于“”这个词概念文字描述,确实不好解释,我看过很多遍,但是现在还是记不住。但是你只需要知道应用两种情况即可
概述Javascript中的作用上下文实现是Javascript语言独有的特性,从某种程度上来说,Javascript语言是十分灵活Javascript中的函数可以采用各种各样上下文作用
明:该教程绕开了javascript一些基本语法知识,直接讲解javascript中最难理解两个部分,也是其他主流面向对象语言区别最大两个部分原型,当然,肯定少不了原型作用
“一切都是对象”这句话重点在于如何去理解“对象”这个概念。当然,也不是所有的都是对象,值类型就不是对象。首先咱们还是先看看javascript中一个常用运算符typeof。typeof应该
作用作用是一个变量函数作用范围,javascript中函数内声明所有变量在函数体内始终是可见,在javascript中有全局作用局部作用,但是没有块级作用,局部变量优先级高于全
javascript中的作用(scope)上下文(context)是这门语言独到之处,这部分归功于他们带来灵活性。每个函数有不同变量上下文作用。这些概念是javascript中一些强大
前言JavaScript中有一个被称为作用(Scope)特性。虽然对于许多新手开发者来说,作用概念并不是很容易理解,本文我会尽我所能用最简单方式来解释作用作用链,希望大家有所收获!作用