你不知道的JS:作用域是什么?

2019-10-25  本文已影响0人  井润

前段时间一直想抽空把《你不知道的JS》给看一看,准备好好巩固JS的基础,于是现在有了这篇文章.

1.两个问题

看到这里的你,是不是以为现在就已经将我要讲的内容已经简单阐述完了,其实不是的,讲到这里其实是为了我们更好地理解作用域而做的铺垫.

2.编译原理

在我们学习JavaScript的过程中,常常看到书中提到几个比较鲜明的字眼,动态类型,解释型的编程语言!但是在本文中,我要说的是,JavaScript是一门编译类型的语言,尽管和你看到的Java等常见的编译类型语言不同!

这两点适合传统的编译类型语言所不同的!虽然说JavaScript引擎编译和传统的编译语言步骤非常相似,但是在某些环节中比预想的还要复杂!

传统编译语言流程中在执行前会经历的三个步骤,称为"编译"

st=>start: start
op1=>operation: 1.分词/词法解析
op2=>operation: 2.解析/语法解析
op3=>operation: 3.代码生成
e=>end: end
st->op1->op2->op3->e
01编译.png

那么对应的流程图中的概念如何理解呢?

其实对应的也就是三个概念,我也只是结合自身的理解和书中的观点,进行简单阐述:

对应的比起编译过程只有三个步骤的语言的编译器而言,JavaScript引擎则复杂得多.

3.理解作用域

首先我们看段代码:

var a = 2;

4.作用域嵌套

在前面的内容中就已经说到过,作用于其实是一套规则,根据名称查找变量的一套规则,但是实际情况中还是很难避免需要同时估计几个作用域!

当一个块或者函数嵌套在另外一个快或者函数中,就发生了对应的作用于嵌套,因此当我们查找某一个变量的时候无法找到的情况下,引擎就会向外层作用域查找,直到抵达最外层的作用域(全局作用域)为止!

foo(a){console.log(a + b);}
var b = 2;
foo(2);

其实通过这个例子就很明白的知道,在函数 foo中无法找到变量b,但是foo又是存在于全局作用域之下和b在同一个作用于,于是foo作用域找不到的变量在全局作用域中找到了!

遍历作用域链的规则其实很简单,引擎从当前的执行作用域中开始查找该变量,如果找不到的话,就会向上一级查找,直到抵达全局作用域的时候,无论还有没有找到,查找过程都会停止!

对应的我们为了更好的理解作用域的处理过程,嵌套作用域的处理过程向一个链条一样,此时这个链条就叫做作用域链!

如果你有更好的建议或者意见,请在留言区告诉我 _!

上一篇 下一篇

猜你喜欢

热点阅读