你不知道的JavaScript(上卷)小结

Posted beckyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你不知道的JavaScript(上卷)小结相关的知识,希望对你有一定的参考价值。

上卷主要讲了作用域、闭包、this以及原型方面的内容。

整体

在github上瞥了一眼了原版的ydkjs,到目前修改篇幅有点大了,this和原型部分的目录已经不见了,应该是改动不少。说说本书的小缺点,一是,有些东西已经和实际不一样了,比如说关键字module,现在已经和import合并了,之类的,这个跟内容质量关系不大,主要是技术发展总会有变更;二是,有些行文内容,比如列出1、2点之类的,感觉彼此之间没什么联系,或者说并没什么联系,不知道怎么就当作一组内容列出来了,有的更是只有1没有其他的2、3、4,看起来就有些奇怪;三是,就翻译来看,有些东西不应该被翻译的,比如运行console.log()的输出内容,有些也被翻译了。当然了,就算有这些小缺点,也算瑕不掩瑜,书中抓住主要一些关键点,细说语法和作者自己的思考,对于工作中写过不少js代码却鲜知背后原理的我来说,着实是上了一课。

第一部分作用域和闭包

从词法分析、语法分析、代码生成简单叙述了编译原理,过度到作用域,讲解引擎是如何查找变量,带出了作用域链,然后简单介绍了LHS和RHS以及TypeError和ReferenceError;然后讲了词法作用域和遮蔽效应,以及修改和创建词法作用域的eval(setTimeout)with
第三章讲了函数作用域,这一章从另一个角度来思考函数,考虑函数不是为了定义某个功能,而是为了将内容隔离开来,内部变量和函数禁止被外部作用域访问,对外部隐藏,从而引出模块的思想,另一方面也可以规避命名冲突,而后讲了具名和匿名函数,又引出了立即执行函数表达式,提出了模块模式,再引出块作用域,ES6之前存在的一些块作用域实现,如withtry/catchcatch分句,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中并不存在的类的误解。

最后

毕业多年,并不是很耐得住性子去看大部头,从这本小书入手,感觉还不错。

以上是关于你不知道的JavaScript(上卷)小结的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记《你不知道的JavaScript(上卷)》——第二部分 this和对象原型

《你不知道的 JavaScript 上卷》 学习笔记

读书笔记你不知道的JavaScript(上卷)--作用域是什么

你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

你不知道的JavaScript(上卷)pdf

你不知道的javascript--上卷--读书笔记1