JavaScript 词法做用域不彻底指北

JavaScript 做用域不彻底指北 中,咱们介绍了做用域的概念以及 JavaScript 引擎、编译器和做用域的关系。做用域有两种主要的工做模型:词法做用域动态做用域。其中最为广泛的也是大多数编程语言所采用的是词法做用域,咱们主要对其进行研究学习。
在传统编译语言的流程中, 程序中的一段源代码在执行以前会经历三个步骤, 统称为“编译”。javascript

  • 分词/词法分析(Tokenizing/Lexing)

这个过程会将由字符组成的字符串分解成(对编程语言来讲) 有意义的代码块, 这些代码块被称为词法单元。java

  • 解析/语法分析(Parsing)

这个过程是将词法单元流(数组) 转换成一个由元素逐级嵌套所组成的表明了程序语法结构的树。 这个树被称        为“抽象语法树”(Abstract Syntax Tree, AST)。编程

  • 代码生成

将“抽象语法树” 转换为可执行代码的过程称被称为代码生成。 这个过程与语言、 目标平台等息息相关。
第一个步骤也叫做词法化,词法做用域就是定义在词法阶段的做用域。简单地说,词法做用域是由你写代码时将变量和块做用域写在哪里来决定的,词法分析器处理代码时会保持做用域不变。
咱们经过如下代码来分析一下词法做用域:数组

function foo(a){
  var b = a * 2;
  function bar(c){
    console.log(a,b,c);
  }
  bar(b * 3);
}
foo(2); //2 4 12

在实例代码中,会有三个逐级嵌套的做用域。微信

1.包含着全局做用域,其中有一个标识符 foo编程语言

image.png

2.包含着 foo 所建立的做用域,其中有三个标识符:a,bar,b函数

image.png

3.包含着 bar 所建立的做用域,其中有一个标识符:cpost

image.png

引擎使用做用域的结构和相互之间的位置关系来查找标识符。咱们在上篇文章中讲过,引擎在做用域中进行变量查找的过程,是从当前做用域逐级向外,直到遇到第一个匹配的标识符结束。
在实例代码中,引擎执行 console.log(a,b,c); 声明,并查找变量 a , b , c 的引用。首先从最内部的做用域,也就是 bar 函数的做用域开始查找,引擎没法在这里查找到变量 a ,便会到上一级所嵌套的 foo 函数做用域中进行查找。引擎在这里找到了变量 a 的引用,便会中止对变量 a 引用的查询。对 b 来讲也是同样的。对 c 来讲,引擎在 bar 函数做用域中就会找到它。
引擎会在做用域中找到第一个匹配的标识符时中止查找。也就是说,在多层的嵌套做用域中能够定义同名的标识符,内部的标识符会遮蔽外部的标识符,这叫做“遮蔽效应”。
词法做用域意味着做用域是由书写代码时函数的位置来决定的。编译的词法分析阶段基本可以知道所有标识符在哪里以及是如何声明的,从而预测在引擎执行代码过程当中如何对它们进行查找学习

参考

  • 《你不知道的JavaScript》
  • 《深刻理解JavaScript特性》

做者:CoderFocusspa

微信公众号:

声明:本文为博主学习感悟总结,水平有限,若是不当,欢迎指正。若是您认为还不错,不妨点击一下下方的推荐按钮,谢谢支持。转载与引用请注明做者及出处。

相关文章
相关标签/搜索