Javascript基础-理解作用域

53 阅读3分钟

1.作用域:一套规则用来定义存储变量并在需要用到时候方便的进行访问。

2.了解程序语言编译: javascript通常被称为“解释型”或“动态语言,但事实上它是一门编译语言,但与传统的编译语言不同,它不是提前编译的,大部分情况下编译发生在代码执行前的几微秒(甚至更短!)的时 间内。

在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤,统称为“编 译”。

  • 分词/词法分析:这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代 码块被称为词法单元(token)。
  • 解析/语法分析:这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法 结构的树。这个树被称为“抽象语法树”(AST)
  • 代码生成:将 AST 转换为可执行代码的过程称被称为代码生成。

3.javascript代码编译和执行的三个关键设计:

  • 引擎:从头到尾负责整个 JavaScript 程序的编译及执行过程。
  • 编译器:负责语法分析及代码生成等脏活累活
  • 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查 询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

4.变量在作用域内部的两种查询方式:

LHS查询:当-变量-出现在-赋值操作-的-左侧-时进行 LHS 查询,当引擎执行 LHS 查询时,如果在顶层(全局作用域)中也无法找到目标变量, 全局作用域中就会创建一个具有该名称的变量,并将其返还给引擎,前提是程序运行在非 “严格模式”下。

ES5 中引入了“严格模式”。同正常模式,或者说宽松 / 懒惰模式相比,严格模式在行为上 有很多不同。其中一个不同的行为是严格模式禁止自动或隐式地创建全局变量。因此,在 严格模式中 LHS 查询失败时,并不会创建并返回一个全局变量,引擎会抛出同 RHS 查询 失败时类似的 ReferenceError 异常。

RHS查询:RHS 并不是真正意义上的“赋 值操作的右侧”,更准确地说是“非左侧”。可以将 RHS 理解成 retrieve his source value(取到它的源值),这意味着“得到某某的 值”。如果 RHS 查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出 ReferenceError 异常。

5.两种主要的作用域工作模型 作用域共有两种主要的工作模型。第一种是最为普遍的,被大多数编程语言所采用的词法 作用域;另一种叫做动态作用域,比如bash脚本、Perl中。

javascript采用的作用域模型是-词法作用域/静态作用域。

词法作用域: 是定义在词法阶段的作用域。换句话说,词法作用域是由你在写 代码时将变量和块作用域写在哪里来决定的

6.eval()和with() JavaScript 中有两个机制可以“欺骗”词法作用域:eval(..) 和 with。这两个机制的副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎地认 为这样的优化是无效的。使用这其中任何一个机制都将导致代码运行变慢。不要轻易使用它们。

7.Javascript中的作用域分类

  • 全局作用域:
  • 局部作用域/函数作用域:
  • 块级作用域:JavaScript 的 ES6(ECMAScript 2015)标准引入了两个新的声明关键字 let 和 const,这两个关键字提供了块级作用域