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

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

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

  • 解析/语法分析(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

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

3.包含着 bar 所创建的作用域,其中有一个标识符:c

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

参考

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

作者:CoderFocus

微信公众号:

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

最新文章

  1. C语言计算字符串子串出现的次数
  2. C++之路进阶——codevs1789(最大获利)
  3. 2016 icpc-ec-final
  4. Solr初始化源码分析-Solr初始化与启动
  5. Varint编码
  6. Spring中BeanPostProcessor
  7. Android ViewPager实现软件的第一次加载的滑动效果
  8. 状压DP总结
  9. mssql拿webshell的方法
  10. 在web.xml中配置struts2拦截器
  11. ReactiveX 学习笔记(15)使用 Rx.NET + Json.NET 调用 REST API
  12. MySQL查看当前用户、存储引擎、日志
  13. 【python系列】SyntaxError:Missing parentheses in call to 'print'
  14. 《JAVA程序设计》第五次实验报告
  15. LightOJ 1097 - Lucky Number 线段树
  16. 决策树ID3算法python实现 -- 《机器学习实战》
  17. meat标签使用
  18. FIR滤波器与IIR滤波器
  19. 1119 机器人走方格 V2(组合)
  20. django的as_view方法实现分析

热门文章

  1. 运行时动态伪造vsprintf的va_list
  2. opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书
  3. STM32处理器AD难度整理
  4. 莱杰:期刊进口流程(文件 ID 1591640.1)
  5. C类型和存储方式的语言变量
  6. 手把手教你开发Nginx模块
  7. 专访Jeffrey Richter:Windows 8是微软的重中之重
  8. mysql 视图,存储过程,游标,触发器,用户管理简单应用
  9. js 操作样式
  10. WPF分辨率适应