原书在线地址:《你不知道的javascript》
1.4:
作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。
4.4:
我们习惯将var a = 2;看作一个声明,而实际上JavaScript引擎并不这么认为。它将var a和 a = 2 当作两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。
5.6:
当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。
1.4:
this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
2.6:
如果要判断一个运行中函数的 this 绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断 this 的绑定对象。
- 由new调用?绑定到新创建的对象。
- 由call或者apply(或者bind)调用?绑定到指定的对象。
- 由上下文对象调用?绑定到那个上下文对象。
- 默认:在严格模式下绑定到undefined,否则绑定到全局对象。
5.5:
如果要访问对象中并不存在的一个属性,[[Get]] 操作(参见第 3 章)就会查找对象内部[[Prototype]] 关联的对象。这个关联关系实际上定义了一条“原型链”(有点像嵌套的作用域链),在查找属性时会对它进行遍历。
附录A.2:
你可能会认为 ES6 的 class 语法是向 JavaScript 中引入了一种新的“类”机制,其实不是这样。class 基本上只是现有 Prototype(委托!)机制的一种语法糖。
1.2:
JavaScript 有七种内置类型: • 空值(null) • 未定义(undefined) • 布尔值(boolean) • 数字(number) • 字符串(string) • 对象(object) • 符号(symbol,ES6 中新增) 除对象之外,其他统称为“基本类型”。
1.4:
变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。
2.6:
简单标量基本类型值(字符串和数字等)通过值复制来赋值/ 传递,而复合值(对象等)通过引用复制来赋值 / 传递。JavaScript 中的引用和其他语言中的引用 / 指针不同,它们不能指向别的变量 / 引用,只能指向值。
3.5:
对于简单标量基本类型值,比如 "abc",如果要访问它的 length 属性或 String.prototype 方法,JavaScript 引擎会自动对该值进行封装(即用相应类型的封装对象来包装它)来实现对这些属性和方法的访问。
1.7:
实际上,JavaScript 程序总是至少分为两个块:第一块现在运行;下一块将来运行,以响应某个事件。尽管程序是一块一块执行的,但是所有这些块共享对程序作用域和状态的访问,所以对状态的修改都是在之前累积的修改之上进行的。 一旦有事件需要运行,事件循环就会运行,直到队列清空。事件循环的每一轮称为一个 tick。用户交互、IO 和定时器会向事件队列中加入事件。
3.7:
每个 Promise 实例(不是 Promise API 命名空间)都有 then(..) 和 catch(..) 方法,通过 这两个方法可以为这个 Promise 注册完成和拒绝处理函数。Promise 决议之后,立即会调用 这两个处理函数之一,但不会两个都调用,而且总是异步调用
《你不知道的javascript》对js的一些规范、行为、常见名词等有深入且易懂的讲解。对于开发人员来说,不论是否遇见书中的场景,都能得到对js更好的认识和巩固。