JavaScript面向对象-作用域-4

作用域

1.词法作用域

每当你编写了一个函数定义,就会创建一个新的词法作用域。
(一个函数{新的词法作用域}大括号里面的就是新的词法作用域)

不同于其他编程语言,在 JavaScript 中,并不是所有的花括号表示的范围都是一个词法作用域。if 语句的块或者 while 语句以及其他循环结构的块并不会创建新的词法作用域。只有函数语句才会创建新的词法作用域。

1.新的词法作用域可以访问他的父类作用域里面的元素,但是访问不到他的同级或者子作用域里面的var元素(var 是一个申明说这个元素是在这个作用域里面)
2.对于一个没有(var)声明的变量,在第一次对它执行赋值操作时(函数运行时),它会自动的被添加到全局作用域(global scope)中,而不论这个赋值语句所在的作用域是哪个。

(乍一看这个效果好像很强大,但实际上这是一种非常不好的编程实践。因为一般来说很少会出现有意忽略这个关键词的。这种情况下,可能会给其他的代码阅读者造成困惑,他们可能会直接认为你犯了个错。)

2.执行上下文

1.定义

就是指当解释器在执行代码时,词法作用域在内存中的表现形式。当解释器在执行代码时,会在内存中构建一个存储系统,用于存放变量以及变量的值,这个存储系统就是由许许多多的上下文构成的。

1.当程序运行时,会在内存中构建内部数据存储,用于存放所有的
量,不管是全局作用域中的还是函数中的变量,都会存放在这
个数据存储中。对于一个词法作用域而言,在程序运行期间可能
会被构建成多个上下文作用域,也可能一个都没有, 这个要取决
于对于给定的函数的调用情况。
由于在内存中构建执行上下文是解释器在执行代码的过程中进行
的,为了弄清楚这个过程,我们需要模拟解释器来运行这段代
码。
在这里插入图片描述
注意图中这个黄色的小箭头,它所指向的位置就是表示我们当前
解释器执行代码的位置。这个过程有点类似于调试的过程。
2.
在这里插入图片描述
当解释器运行到第一行代码之前, 会首先创建一个执行环境。 解释器首先会在内存中创建一个全局作用域的执行 上下文。我们之前说过,词法作用域与执行下文其实是一体两面,执行它们是指洞一个东西,所谓执行上下文就是词法作用域程序运行时在内存中的表现形式。
我们会在图形的右半部分用与左半部分相同背景色的区块表示词法作用域相应的执行上下文。如当前,解释器在内存中构建了一
个区域表示全局作用域执行下文。用黄色的边界圈出来的,则
是表示解释器当前的执行上下文。
所谓当前执行上下文,也就是说解释器要查找变量的话,首先开
始查找的位置。目前为止, 全鋦作用域执行上下文(下面简称全
局上下文)是唯一存在的上下文,因此它就是当前.上下文。
3.在这里插入图片描述
当运行了第一行代码之后,解释器在当前的执行上下文中创建了个键值对,存放的是变量以及这个变量的值。a = 100;
在这里插入图片描述
然后解释器继续往下执行,当运行完这一-行代码时,会在全局上
下文中增加一个新的键值对。
这里解释器会忽略掉红色和绿色的区域,只有当这个函数被调用时,才桧执行。
在这里插入图片描述
然后再往下运行的时候,遇到了对函数add的调用,因此,解释器就进入了这个函数。当解释器开始执行这个函数的时候,就会创建一个新的执行上下文,而这个新的执行上下文则是根据这个函数作用域来创建的。并且,注意在这个函数运行期间,解释器的当前执行上下文变成了这个函数的执行上下文。
在这里插入图片描述
当函数add(中的第一 行代码执行过后,会在当前的这个函数的执行上下文中增加一 个新的变量。
在这里插入图片描述
然后,往下执行,又在当前的函数的执行上下文中增加了一个变量,这次存放的是一个函数对象。
然后再往下执行的时候,发现有个printf变量, 那么现在解释器就要查找这个变量了,首先从当前执行上下文中查找,结果一下就找到了。当找到这个变量之后,发现其值是一个函数对象,而printf后面的这对括号则表示调用这个函数,因此接下来解释器就进入了这个函数。

在进入这个函数时,解释器为这个printf函数创建了一个新的执行上下文,組,解释器的当前执行上下文变成了这个新的上下文。

在这里插入图片描述
然后再往下执行。
在这里插入图片描述
这一行代码在新的执行上下文中增加了一个新的变量。
在这里插入图片描述
接下来这行代码需要将这三个变量的值合并成一个 字符串,并打
印输出,因此解释器开始由内而外扫描这些上下文,来查找这三
个变量了。
首先是a:
1)从当前的执行上文,即绿色区域查找,结果没找到。
2)然后向外,找到紧靠着的外围的上下文,即红色的这个上下
文,也没有找到。
3)继续向外找,现在到了全局上下文了,并且在其中找到了这
个a变量。
欺是b,在第二红色的上下文中找到了它。
后是c,这个变量最好找了,在当前上下文中一下就找到了。
然后将这三个值打印输出,那么这个printf()就算是执行完成
了。
最终的输出结果为: 175
在这里插入图片描述
最终的输出结果为: 175175

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码浪人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值