Content

  1. What is Scope?
  2. Lexical Scope
  3. Function Vs. Block Scope
  4. Hoisting
  5. Scope Closures

Appendix:

  1. Dynamic Scope
  2. Polyfilling Block Scope
  3. Lexical-this
  4. Thank You's



Chapter1: What is Scope?

In fact, the ability to store values and pull values out of variables is what gives a program state.

背后的问题:

变量储存在哪?

当需要用到它们,程序怎样找到它们?

回答:

需要a well-defined set of rules: Scope.

但是Scope在哪里和如何得到设置get set?


Compiler Theory

JS是编译后的语言。

Compilation的几个大步骤:

  1. Tokenizing/Lexing(代币/类型分析): 把a string of characters分解为有意义的小块,被成为tokens。
  2. Parsing: 把tokens转化进一个嵌套元素的tree结构。集体地代表程序的语法结构。
    • tree叫做Abstract Syntax Tree(提取句法树)
    • var a = 2;
      //被分解成:
      /*
      顶层: VariableDeclaration
      子节点 Identifier: a
      子节点 AssignmentExpression: =
        子节点  NumericLiteral: 2
      */
  3. Code-Generation: 把这个AST转化为可执行的代码。(根据不同语言,有区别)。
    • 转化为机器指令,目的是来创建一个变量a, 并储存一个value到a.

当然JS引擎更复杂。编译时间,在许多情况下,仅仅耗时微秒或更少。并立即在编译后执行代码。


Understanding Scope

学习理解Scope,可以比喻成,进程的一场谈话。

var a = '123'

The Cast 全体演员

  • Engine 响应从开始到结束编译,并执行JS程序。
  • Compiler 编译器。处理所有脏活,包括parsing and code-generation.
  • Scope 收集和保存一个名单。名单上包括所有的变量identifiers,并强迫实施一个严格的规则:这些identifiers如何存取到 currently executing code。

Back & Forth

Engine看2个独立的声明。1个是在编译期间,编译器处理。另一个是在执行期间,引擎处理。

首先,编译器Tokening and Lexing,

然后,  Parsing 代码到AST树,

最后,  Code-Generation。(用到Scope和Engine的交互。)

  1. 编译器询问Scope"变量a是否存在于你的list中?"。

    • 如果是,继续;  如果否,编译器要求Scope去声明一个新的变量a
  2. 编译器生产代码用于Engine在后续执行,去处理a = 2。
    1. Engine 跑起来,先询问Scope:你的当前list里面有变量a吗?
    2. 如果有,Engine使用这个变量, assignment.
    3. 如果没有,Engine去其他地方查看(查看嵌套的Scope部分)

总结:

编译器先声明变量,然后Engine在Scope中查询这个变量,如果发现就分配它。

首先Compiler Speak

然后Engine/Scope Conversation

Engine执行代码,是在编译器生产后的第2步,Engine查询变量a是否已被声明。这个查询是咨询Scope。

Engine执行的查询的类型(LHS和RHS),影响查询的结果outcome。

本例子:var a = '123';

Engine将执行一个“Left-hand Side”查询,查询内容是变量a。

还有"Right-hand Side",准确的描述是:非左侧查询。

Side是指分配符号an assignment operation的左右两边。

如: console.log(a); 就是非左侧查询。

其实LHS和RHS只是涉及是否assign的一种称呼。

"who's the target of the assignment (LHS)" and "who's the source of the assignment (RHS)".

(这两个概念有什么用??见后,ES6以后区别不明显了。)

 Engine和Scope的对话:

function foo(a) {
console.log( a ); //
} foo( 2 );

Engine: Scope,我有一个右侧查询, 引用foo,听说过它吗?

Scope: 当然,我有。Compiler在一秒前声明了它。它是函数。给你!

Engine: 太好了,

You Don't Know JS: Scope & Closures (第一章:什么是Scope)的更多相关文章

  1. Node.js学习(第一章:Node.js安装和模块化理解)

    Node.js安装和简单使用 安装方法 简单的安装方式是直接官网下载,然后本地安装即可.官网地址:nodejs.org Windows系统下,选择和系统版本匹配的.msi后缀的安装文件.Mac OS ...

  2. Node.js学习(第一章:Node.js简介)

    Node.js是什么? Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成, 目前官网最新版本已经更新到 12.0.0版本,最新稳定的是10.15.3.Nod ...

  3. You Don't Know JS: Scope & Closures(翻译)

    Chapter 1: What is Scope? 第一章:什么是作用域 One of the most fundamental paradigms of nearly all programming ...

  4. You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)

    第二章,作用域由一系列的bubbles组成.每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions).这些bubbles相互嵌 ...

  5. You Don't Know JS: Scope & Closures (第2章: Lexical Scope)

    2种主要的models for how scope work. 最普遍的是Lexical Scope. 另一种 Dynamic Scope.(在Appendix a中介绍.和Lexical Scope ...

  6. You Don't Know JS: Scope & Closures (附加:Lexical/dynamic作用域)(附加:Lexical-this)

    JavaScript只有Lexical Scope 模式 Lexical Scope就是在写代码的时候,定义函数的时候创建的作用域! 而动态作用域是在runtime时,函数被调用的地方的作用域! 实际 ...

  7. 【vue.js权威指南】读书笔记(第一章)

    最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...

  8. 第一章 用three.js创建你的第一个3D场景

    第一章 用three.js创建你的第一个3D场景 到官网下载three.js的源码和示例. 创建HTML框架界面 第一个示例的代码如下: 01-basic-skeleton.html 位于 Learn ...

  9. 【js 笔记】读阮一峰老师 es6 入门笔记 —— 第一章

      鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ...

随机推荐

  1. LOIC

    Pre: http://sourceforge.net/projects/loic Getting the Software To DDos, first your going to have to ...

  2. 学习dart从这里开始

    void main() { ; i < ; i++) { print('hello ${i + 1}'); } } // 定义个方法. printNumber(num aNumber) { pr ...

  3. smbclient和mount -t cifs共享win的共享文件夹? autocad小记

    插入U盘没有反应? 首先,打开设备管理器, 发现usb大容量设备为黄色感叹号 其次, 将这个usb大容量设备先卸载, 然后点击"自动扫描硬件变化",就可以重新自动安装usb的驱动. ...

  4. Tutorials on Inverse Reinforcement Learning

    Tutorials on Inverse Reinforcement Learning 2018-07-22 21:44:39 1. Papers:  Inverse Reinforcement Le ...

  5. 论文笔记:Tracking by Natural Language Specification

    Tracking by Natural Language Specification 2018-04-27 15:16:13  Paper: http://openaccess.thecvf.com/ ...

  6. 《操作系统_FCFS和SJF》

    先来先服务FCFS和短作业优先SJF进程调度 转自:https://blog.csdn.net/qq_34374664/article/details/73231072 一.概念介绍和案例解析 FCF ...

  7. 2、Python函数详解(0601)

    函数的基础概念 1.函数是python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构: 2.函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件: 3.函数用于将相关功能打包并参 ...

  8. Go 定长的数组

    1.Go 语言数组的简介 几乎所有的计算机语言都有数组,应用非常的广泛.同样,在 Go 语言中也有数组并且在数组的基础上还衍生出了切片(slice). 数组是一系列同一类型数据的集合,数组中包含的每个 ...

  9. python FAE

    1.python 时间戳用localtime转换时间戳较大时报错 ValueError: timestamp out of range for platform time_t 2.python面向对象 ...

  10. JavaScript基本内容

    注释: /*多行 注释*/ //单行注释 变量: //变量均为对象,常用类型:String.Number.Boolean.Array.Object var value = "hello&qu ...