上卷次要讲了作用域、闭包、this 以及原型方面的内容。
整体
在 github 上瞥了一眼了原版的 ydkjs,到目前批改篇幅有点大了,this 和原型局部的目录曾经不见了,应该是改变不少。说说本书的小毛病,一是,有些货色曾经和理论不一样了,比如说关键字 module
,当初曾经和import
合并了,之类的,这个跟内容品质关系不大,次要是技术倒退总会有变更;二是,有些行文内容,比方列出 1、2 点之类的,感觉彼此之间没什么分割,或者说并没什么分割,不晓得怎么就当作一组内容列出来了,有的更是只有 1 没有其余的 2、3、4,看起来就有些奇怪;三是,就翻译来看,有些货色不应该被翻译的,比方运行 console.log()的输入内容,有些也被翻译了。当然了,就算有这些小毛病,也算瑕不掩瑜,书中抓住次要一些关键点,细说语法和作者本人的思考,对于工作中写过不少 js 代码却鲜知背地原理的我来说,着实是上了一课。
第一局部作用域和闭包
从词法剖析、语法分析、代码生成简略叙述了编译原理,适度到作用域,解说引擎是如何查找变量,带出了作用域链,而后简略介绍了 LHS 和 RHS 以及 TypeError 和 ReferenceError;而后讲了词法作用域和遮蔽效应,以及批改和创立词法作用域的 eval(setTimeout)
、with
;
第三章讲了函数作用域,这一章从另一个角度来思考函数,思考函数不是为了定义某个性能,而是为了将内容隔离开来,外部变量和函数禁止被内部作用域拜访,对外部暗藏,从而引出模块的思维,另一方面也能够躲避命名抵触,而后讲了具名和匿名函数,又引出了立刻执行函数表达式,提出了模块模式,再引出块作用域,ES6 之前存在的一些块作用域实现,如 with
和try/catch
的 catch
分句,let 和 const 作为 ES6 新增的关键字,能够将变量绑定在块作用域上,次要解说了在垃圾收集和 for 循环中的应用;
第四章篇幅比拟简短,讲了晋升的内容,变量晋升和函数晋升,解说了变量的定义过程,是先在编译阶段申明,后由引擎赋值的一个程序,而后解说了函数申明晋升优先于变量晋升;
最初一章是 js 中很重要的闭包的内容,我以前也是被闭包绕晕,总是说不清闭包到底是啥,这里很清晰的说明确了,闭包是与作用域无关,利用了作用域,当函数能够记住并拜访所在的词法作用域,就产生了闭包,理论利用中,常见的,比方咱们在异步申请的回调函数中应用了该函数申明内部的变量 a,而后在回调函数执行时就会拜访到变量 a 所在的词法作用域,这通常会引起垃圾回收的问题,即定义回调函数的函数在执行结束后并不能被立刻销毁其外部作用域,因为还有内部对它的援用,当外部定义函数被传递到内部援用时很容易引起此类问题,之后解说了循环中的闭包会引起的问题以及 let 的解决方案,最初局部讲了利用闭包创立模块、模块加载器以及 ES6 的模块机制。
附录中讲了动静作用域,比对了词法作用域,两者的不同;还简略讲了块作用域的代替计划,如应用try/catch
,次要为了向下兼容;最初提了箭头函数对 this 绑定的影响,作者认为箭头函数是用词法作用域代替了 this 的绑定规定,如何抉择看集体,但要了解其背地的原理。
第二局部 this 和原型
前局部次要解说 this,this 到底是个啥,到底援用了什么,与调用栈无关,而后解说了 this 绑定的优先级,如何批改 this 的绑定。
接着进入原型局部,以前就常常被 prototype 绕晕,尽管晓得原型的存在,可是不甚了解,始终认为定义一个函数,而后在其 prototype
属性上定义函数和属性,再用 new
调用函数,是很惯例的步骤做法,因为以前做过 Java,两者在语法上也很相似,就认为用类的角度对待 JavaScript 也是可行的。
其实以前也看过一个说法,说在 Java 中,是先定义一个蓝图,也就是类,而后再盖房子,就是实例,而在 JavaScript 中,是先盖一个房子,而后再盖一些和它类似的房子,也是相似的比喻,意思就是 JavaScript 中并没有所谓的类,只有一个个实实在在的对象。
在 JavaScript 中,对象和函数没有间接关系,有关系的是两个对象,一个对象作为另一个对象的原型存在,只是恰好在函数申明时它会默认关联一个 prototype
对象属性,而后类的爱好者利用了这个属性。
后半局部从类型作为切入点,进入到对象的内容,而后讲了类方面的实践和 JavaScript 中对类设计模式的实现,JavaScript 中的原型,而后介绍了类模型和委托模型,介绍了两种不同的代码格调,不过对于继承的这个复制,我不是很明确,以前做 Java 的时候,也没听说过继承和实例化是复制的这种说法,可能是思维思维层面的货色,而后用 JavaScript 中的 prototype
对象中的内容被批改从而影响委托它的对象,作为举例,感觉不是很得当,因为 Java 中的类定义并不能被批改,因此咱们无奈验证类定义的批改是否会影响它的子类和实例,不过就这方面来说,JavaScript 具备其灵活性,不适宜固定死的类,最初在两个场景中比对了面向对象和对象关联两种代码格调,引入行为委托的概念,简略说了 ES6 中的 class 语法,的确容易加深人们对 JavaScript 中并不存在的类的误会。
最初
毕业多年,并不是很耐得住性子去看大部头,从这本小书动手,感觉还不错。