《你不知道的JavaScript》(上卷)读书笔记
第一部分
语言
事实上,JavaScript是一门编译语言,但与传统的编译语言不同,他不是提前编译的,编译结果也不能在分布式系统中进行移植.
JavaScript引擎进行编译的步骤与传统语言非常相似,包括分词/词法分析,解析/语法分析,代码生成.
比起那些编译过程只有三个步骤的语言的编译器,JavaScript在语法分析和代码生成阶段有特定的步骤对运行性能进行优化,包括对冗余元素进行优化等
LHS与RHS
- LHS:左值查询,试图找到变量的容器本身,从而可以对其赋值.
- RHS:右值查询,与简单地查找某个变量的值别无二致.
- 从概念上讲,LHS查找赋值的目标,RHS查找赋值的源头.
词法作用域
是定义在词法阶段的作用域,换句话说,是由你在写代码时将变量和块作用域写在哪里决定的,区别于动态作用域.欺骗词法作用域
eval
- 接受一个字符串为参数,并将其中的内容视为好像在书写时就存在于程序中的这个位置的代码.
- 严格模式下,eval有自己的词法作用域.
- JavaScript中还有一些类似的功能效果,例如setTimeout以及setInterval第一个参数(本质上还是调用了eval),以及new Function的最后一个参数.
with
- 尽管with块可以将一个对象处理为词法作用域,但是这个块内部正常的var声明比并不会被限制在这个块的作用域中,而是被添加到with所处的函数作用域中.
- 严格模式下被禁用了.
性能问题
编译阶段的很多优化没法做了.函数作用域
函数声明与函数表达式
区分函数声明和表达式最简单的方法是看function关键字出现在生命中的位置。如果function是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式。匿名与具名
始终给函数表达式命名是一个最佳实践。未完待续