You Don't Know JS: Scope & Closures (第一章:什么是Scope)
Content
- What is Scope?
- Lexical Scope
- Function Vs. Block Scope
- Hoisting
- Scope Closures
Appendix:
- Dynamic Scope
- Polyfilling Block Scope
- Lexical-this
- 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的几个大步骤:
- Tokenizing/Lexing(代币/类型分析): 把a string of characters分解为有意义的小块,被成为tokens。
- Parsing: 把tokens转化进一个嵌套元素的tree结构。集体地代表程序的语法结构。
- tree叫做Abstract Syntax Tree(提取句法树)
var a = 2;
//被分解成:
/*
顶层: VariableDeclaration
子节点 Identifier: a
子节点 AssignmentExpression: =
子节点 NumericLiteral: 2
*/
- 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的交互。)
- 编译器询问Scope"变量a是否存在于你的list中?"。
- 如果是,继续; 如果否,编译器要求Scope去声明一个新的变量a
- 编译器生产代码用于Engine在后续执行,去处理a = 2。
- Engine 跑起来,先询问Scope:你的当前list里面有变量a吗?
- 如果有,Engine使用这个变量, assignment.
- 如果没有,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)的更多相关文章
- Node.js学习(第一章:Node.js安装和模块化理解)
Node.js安装和简单使用 安装方法 简单的安装方式是直接官网下载,然后本地安装即可.官网地址:nodejs.org Windows系统下,选择和系统版本匹配的.msi后缀的安装文件.Mac OS ...
- Node.js学习(第一章:Node.js简介)
Node.js是什么? Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成, 目前官网最新版本已经更新到 12.0.0版本,最新稳定的是10.15.3.Nod ...
- You Don't Know JS: Scope & Closures(翻译)
Chapter 1: What is Scope? 第一章:什么是作用域 One of the most fundamental paradigms of nearly all programming ...
- You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)
第二章,作用域由一系列的bubbles组成.每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions).这些bubbles相互嵌 ...
- You Don't Know JS: Scope & Closures (第2章: Lexical Scope)
2种主要的models for how scope work. 最普遍的是Lexical Scope. 另一种 Dynamic Scope.(在Appendix a中介绍.和Lexical Scope ...
- You Don't Know JS: Scope & Closures (附加:Lexical/dynamic作用域)(附加:Lexical-this)
JavaScript只有Lexical Scope 模式 Lexical Scope就是在写代码的时候,定义函数的时候创建的作用域! 而动态作用域是在runtime时,函数被调用的地方的作用域! 实际 ...
- 【vue.js权威指南】读书笔记(第一章)
最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...
- 第一章 用three.js创建你的第一个3D场景
第一章 用three.js创建你的第一个3D场景 到官网下载three.js的源码和示例. 创建HTML框架界面 第一个示例的代码如下: 01-basic-skeleton.html 位于 Learn ...
- 【js 笔记】读阮一峰老师 es6 入门笔记 —— 第一章
鉴于最近用 vuejs 框架开发项目,其中有很多涉及到 es6 语法不太理解所以便认真地读了一下这本书. 地址:http://es6.ruanyifeng.com/#README 第一章:let ...
随机推荐
- ./configure: error: C compiler cc is not found
没有安装gcc 在安装nginx之前先安装依赖软件 yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget htt ...
- Oracle使用——oracle表锁住,杀掉锁表进程
背景 在操作Oracle时,多人同时操作oracle数据库的同一张表的时候,经常会造成锁表现象,这时需要手动进行解锁. 步骤 以dba身份登录Oracle数据库(否则用户缺少杀掉进程权限,需要给用户分 ...
- linux内核中的fuse是什么?
答: 一个用户态文件系统框架,属于内核的一种特性. 1.组成部分 fuse.ko(内核模块) + libfuse.*(用户空间库) + fusemount(挂载工具) 2.参考资料 fuse.txt
- hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询
单点更新 区间查询 #include <bits/stdc++.h> using namespace std; #define m ((l+r)/2) #define ls (rt< ...
- P3232 [HNOI2013]游走
吐槽 傻了傻了,对着题解改了好长时间最后发现是自己忘了调用高斯消元了... 思路 期望题,分配编号,显然编号大的分给贡献次数小的,所以需要知道每个边被经过次数的期望 然后边被经过的次数的期望就是连接的 ...
- Attribute2Image --- Conditional Image Generation from Visual Attributes 论文笔记
Attribute2Image --- Conditional Image Generation from Visual Attributes Target: 本文提出一种根据属性生成图像的产生式模 ...
- BZOJ 4771 七彩树(可持久化线段树合并)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4771 思路 和 HDU 3333 其实有点像,不过是把序列的问题放在了树上,多维护一个深度即 ...
- numa.h:No such file or directory 解决方法
参考: numa.h:No such file or directory numa.h:No such file or directory 解决方法 Ubuntu: $ apt-get install ...
- Mysql数据类型、约束、存储引擎
一.数据类型 整数类型 默认有符号的 设置为无符号 1.create table t2(age tinyint unsigned); 2.建表后用alter修改 tinyint[(m)] [unsig ...
- centos7 修改密码
Centos7破解密码的方法 Centos7忘记密码 在工作或者自己练习的时候我们难免会大意忘掉自己的root密码,有些同学忘掉密码竟然第一选择是重装系统,工作中可万万使不得! 本篇博客将讲解 ...