You Don't Know JS: Scope & Closures (第2章: Lexical Scope)
2种主要的models for how scope work.
最普遍的是Lexical Scope.
另一种 Dynamic Scope。(在Appendix a中介绍。和Lexical Scope 进行对比)
Lex-time
lexical scope is scope that is defined at lexing time.
lexical scope是基于变量和blocks of scope被创建(被你,在write time)。
不知道这是啥玩意!
我的理解就是定义作用域的有效范围的时间。
Look-ups
Scop look-ups once it finds the first match!
相同的标志符name可以在不同层的nested scope被定义。这称为shadowing遮挡,内identifier遮挡了外部identifier。
忽略shadowing,作用域查询总是在最内层作用域开始执行,然后bubble up, 直到找到第一个匹配并停止。
⚠️
全局变量自动成为全局对象的属性(window in browser, etc.), 所以可以不直接的通过它的lexical name来引用一个全局变量,而是非直接的通过全局对象的属性的方式引用:window.a
因此全局变量即使被遮盖shadowed, 也可以进行存取。
无论一个函数从哪里引用,如果引用,它的lexical作用域在它声明declared时就定义好了!
Cheating Lexical
如何在运行时间,欺骗/修改 Lexical作用域?
JS有2个机制。但都不被wider社团赞成!被认为是坏的实践!
看一下这2个机制:
eval
动态创建代码,(Ruby内也有eval方法,也是用于动态创建的)
在开发者定义函数时,Lexical作用域内没有定义的变量/函数.
通过eval(), 在函数被创建后,在调用这个函数时,创建一个内部变量/函数。
严格模式下,报错❌

动态创建,极少使用。
with关键字(已经被遗弃,不看了)
Performance
不要使用eval() . JS Engine有许多执行优化,在编译阶段。其中一些优化能够静态地分析代码。
变量和函数声明提前定义好的话,在执行期间,优化就可以花费较少精力来解决identifiers。
如果使用eval(), 这些优化就没有效果了,甚至不会执行。
没有优化,代码运行就会变慢!!
Review
Lexical Scope意思是scope被定义,由开发阶段决定函数在哪里被声明。
lexing阶段的编译能够知道:所有的identifiers被定义在哪,和如何被定义的,并因此预言它们(变量/函数)如何在执行阶段被查询。
eval()造成Lexical Scope被欺骗/修改。导致了负面效果。
即:Engine不能够预先知道在编译阶段scope如何查询,也就无法优化编译阶段。导致代码运行变慢。
不要使用!!eval()
You Don't Know JS: Scope & Closures (第2章: Lexical Scope)的更多相关文章
- You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)
第二章,作用域由一系列的bubbles组成.每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions).这些bubbles相互嵌 ...
- You Don't Know JS: Scope & Closures (第4章: Hoisting)
Chapter4: Hoisting 变量附加到哪个层次的scope,由它们在哪里和如何声明(let, var)来决定. Function scope/Block scope都有相同的法则:任何变量在 ...
- (未完成👃)You Don't Know JS: Scope & Closures (第5章: Scope & Closures)
Chapter 5: Scope Closure 我们到达这里时,已经对作用域如何工作有了非常健康稳固的理解. 下面,我们转移注意力到一个及其重要,但长期难以理解,几乎是神话中的部分语言:Closur ...
- You Don't Know JS: this & Object Prototypes( 第一章 this or That?)
Foreword this 关键字和prototypes 他们是用JS编程的基础.没有他们创建复杂的JS程序是不可能的. 我敢说大量的web developers从没有建立过JS Object,仅仅对 ...
- You Don't Know JS: Scope & Closures (第一章:什么是Scope)
Content What is Scope? Lexical Scope Function Vs. Block Scope Hoisting Scope Closures Appendix: Dyna ...
- You Don't Know JS: Scope & Closures (附加:Lexical/dynamic作用域)(附加:Lexical-this)
JavaScript只有Lexical Scope 模式 Lexical Scope就是在写代码的时候,定义函数的时候创建的作用域! 而动态作用域是在runtime时,函数被调用的地方的作用域! 实际 ...
- You Don't Know JS: Scope & Closures(翻译)
Chapter 1: What is Scope? 第一章:什么是作用域 One of the most fundamental paradigms of nearly all programming ...
- js的closures(闭包)
JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用 ...
- You Don't Know JS: Async & Performance(第一章, 异步:now & later)
Chapter 1: Asynchrony: Now & Later 在一门语言中,比如JavaScript, 最重要但仍然常常被误解的编程部分是如何在一个完整的时间周期表示和操作程序行为. ...
随机推荐
- matlab做聚类分析
说明:如果是要用matlab做kmeans聚类分析,直接使用函数kmeans即可.使用方法:kmeans(输入矩阵,分类个数k). 转载一: MATLAB提供了两种方法进行聚类分析: 1.利用 clu ...
- 使用msi自动安装系统
在实际生活中, 还是要尽量使用 自动化 脚本 等来处理/执行问题, 那样更快更省力省时间 要多使用 网络工具, 网络工具在 管理/ 使用网络的过程 中还是很有用的. 要有这种 "多使用网络工 ...
- CodeForces 459C Pashmak and Buses(构造)题解
题意:n个人,k辆车,要求d天内任意两人都不能一直在同一辆车,能做到给出构造,不能输出-1 思路:我们把某一个人这d天的车号看成一个d位的数字,比如 1 1 2 3代表第一天1号车.第二天1号车.第三 ...
- html 之 浮动(待补充)
通过设置float 样式属性来决定区块标签的浮动 问题:区块与非区块浮动的特点(左右) 区块与区块浮动的特点(左右) ie浏览器与谷歌等浏览器的效果差异
- P4306 [JSOI2010]连通数
思路 要求求每个点能到达的点数就是传递闭包 然后n^3Floyd可做,但是n=2000,然后bitset压位 复杂度\(O(\frac{n^3}{32})\),能过 代码 #include <c ...
- NRF24L01模块配置
发射数据时: (1)首先将nRF24L01配置为发射模式 (2)接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低 ...
- 如何某个js文件中的 console
因为自己引用了别人的一个 js 文件,但里面有很多事件相关的 console 输出.自己并不想去修改别人的文件.但想屏蔽掉里面的 console . 有多个 js 文件里有 console.log . ...
- Java中泛型Class<T>、T与Class<?>、 Object类和Class类、 object.getClass()和Object.class
一.区别 单独的T 代表一个类型(表现形式是一个类名而已) ,而 Class<T>代表这个类型所对应的类(又可以称做类实例.类类型.字节码文件), Class<?>表示类型不确 ...
- string截取、替换、查找子串函数,find_first_of 用法
1. 截取子串 s.substr(pos, n) 截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos) 截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回 2 ...
- 【Django】【二】模板
1. Django-bootstrap3 guest>python -m pip install django-bootstrap3 [代码] settings.py ""& ...