首页 > 编程语言 > 详细

你不知道的JavaScript(上)- 作用域和闭包 - 作用域是什么

时间:2020-11-07 14:04:10      阅读:20      评论:0      收藏:0      [点我收藏+]

作用域和闭包

作用域是什么

  作用域是一套规则,用来存储和访问变量。
  任何编程语言都离不开作用域,正是作用域这种存储和访问变量的能力将状态带给了程序,赋予了编程语言可以实现丰富功能的能力
  讲到作用域不得不提两个重要的角色:引擎和编译器。
  引擎从同到尾负责整个Javascript程序的编译和执行过程。编译器扶着词法分析、语法分析、代码生成等脏活累活。

1. 编译的原理

  JavaScript是一门编译型的语言,但是它不会提前编译,它的编译发生在代码执行的前的几微秒
  传统的编译分成三个阶段
  1. 分词/词法分析 -- 将字符组成的字符串分解成有意义的代码块(词法单元)
       例如 `var a = 2; ==> var、a、=、2、;`
  2. 解析/语法分析 -- 将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表语法结构的树(抽象语法树)
       例如 `var a = 2` var == VariableDeclation 顶级节点; a == Identifier 子节点 以及assignmentExpression的子节点的值NumerLiteral = 2的子节点
  3. 代码生成 -- 将AST转换为可执行代码的过程

2. 理解作用域

  变量的赋值操作会执行两个动作,1.声明一个变量,2.查找这个变量并给他赋值
  这个过程中变量查询主要分为:LHS查询(赋值操作的目标)和RHS查询(赋值操作的源头);

3. 作用域嵌套

  当一块或函数嵌套在另一块或函数中是,就发生了嵌套。
  引擎从当前作用域开始查找变量,如果找不到,就向上一级继续查找,知道最外层的全局作用域。

4. 异常

  如果全局作用域中也没找到,会根据查询类型不同抛出不同错误。
  LHS查询在严格模式下抛出ReferenceError,非严格模式下隐式的创建全局变量;RHS抛出ReferenceError错误。

5. 小结

  作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。
  如果查找的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询

你不知道的JavaScript(上)- 作用域和闭包 - 作用域是什么

原文:https://www.cnblogs.com/small-double/p/13940589.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!