《你不知道的javascript》读书笔记 一:作用域和闭包
其实之前已经把《你不知道的 JavaScript》上卷读完了,但是其实只是囫囵吞枣,看的很初略,没有自己的思考,再到今天其实有点忘得差不多,这次重新精读一次,记录下自己的思考。
JS 是如何处理变量声明的?
js 入门会遇见很多很神奇的点,很著名的就是变量提升
- var 变量提升
1
2
3b = 3;
var b;
console.log(b); // 3 - 函数声明提升在这里使用
1
2
3
4
5hosting(); // 'function hosting'
function hosting() {
console.log("function hosting");
}
var hosting = 0;var
声明的变量标志符被提升了,甚至可以在声明前调用它,函数也是同理,并且函数声明的值也被一同提升了。
上面的代码可以翻译成类似的同理代码:
- var 变量提升
1
2
3var b = undefined;
b = 3;
console.log(b); // 3 - 函数声明提升了解了之后,其实我们还会冒出更多的疑问,为什么会这样?为什么这么设计?
1
2
3
4
5var hosting = function hosting() {
console.log("function hosting");
};
hosting(); // 'function hosting'
hosting = 0;
《你不知道的 JavaScript》正好解答了这一部分。
编译原理
在了解 JS 如何变量声明前,我们还需要一些预先的知识,了解代码是如何编译的。编译器前端大致有下面几个流程:
词法分析就是将字符串分解成适合理解的词法单元,例如 23 + 10 * 2
就应该是 5 个词法单元23
+
10
*
2
,词法分析有两种方式,一种是基于状态机的,另一种是基于正则的,两者是等同的。