文章最新内容已迁移至公众号 不知非攻,后续维护也在公众号里修正,欢迎关注。
作用域与作用域链本应该是一个非常简单的概念。可是在近两年多的留言中,我发现这些概念反而成为了大多数人想不明白的点,而感到困惑的原因在于,别的文章里,常常会提到词法作用域,词法分析等概念,到底是什么东西?好像跟我说的有一点不一样,但又不知道哪里不对?
为了避免接下来更多的同学造成同样的困扰,我写了一篇名为(v8引擎是如何工作的)文章,为大家分析JS的工作原理。后续会整理进入基础进阶系列文章。大家可以随时阅读。
词法环境(Lexical Environments)
官方规范对词法环境的说明是:词法环境(Lexical Environments)是一种规范类型,用于根据ECMAScript代码的词法嵌套结构来定义标识符与特定变量和函数的关联。
官方就是爱把简单的东西复杂化,专业!
通俗来说,词法环境就是一套约定好的规则。我们写代码,应该按照这个规则来。JS引擎对JS源码进行词法分析,也是按照这个规则来。
**因此,词法环境,在我们写代码的时候就已经确定了。**明白了这一点,对于区分词法环境与执行上下文有非常关键的意义。
词法环境,其实就是作用域,有的人叫词法作用域等等,叫法都不是重点,重点是,不要读太多杂乱的文章,反而搞得自己更迷糊
得出结论:
一、在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理JS引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找。
这里的标识符,指的是变量名或者函数名
二、JavaScript中有全局作用域与函数作用域(因为eval我们平时开发中几乎不会用到它,这里不讨论)。
现在,大家知道词法环境,作用域和执行上下文的区别了吗?
更多的关于JS引擎是如何处理JS代码的,大家可以参考(V8引擎是如何工作的)一文
除此之外,一个词法环境,由环境记录(Environment Records)<