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

beckyyyy      2022-02-12     669

关键词:

上卷主要讲了作用域、闭包、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(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些”坑”,在这里写一些博客记录一下笔记以便消化吸收。1编译原理在此书中,开始便提出:Javascript是一门编译型语言,我... 查看详情

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

文章目录第6章行为委托6.1面向委托的设计6.1.1类理论6.1.2委托理论1.互相委托(禁止)2.调试6.1.3比较思维模型6.2类与对象6.2.1控件“类”ES6的class语法糖6.2.2委托控件对象6.3更简洁的设计反类6.4更好的语法反词法6... 查看详情

你不知道的javascript(上卷)pdf

...sp; 内容简介  · · · · · ·JavaScript语言有很多复杂的概念,但却用简单的方式体现出来(比如回调函数),因此,JavaScript开发者无需理解语言内部的原理,就能编写出功能全面的程序;就像收音机... 查看详情

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

作用域是什么?  答:在《你不知道的javascript》书中提到,作用域就是根据名称查找变量的一套规则。古语有“无规矩不成方圆”,但是没有方圆,规矩又给谁用?所以个人理解作用域就是“规矩”+”方圆“。作用域是在创... 查看详情

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

...;        1— 作用域对JavaScript而言,大部分情况下编译发生 查看详情

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

...以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。闭包有哪些应用?  答:函数作为返回值:functionfoo(){vara=2;functionbar(){//bar拥有涵盖foo作用域的闭包,并对它保持 查看详情

javascript中的this—你不知道的javascript上卷读书笔记

this是什么?this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。当一个函数被调用时,会创建一个活动记录(有时... 查看详情

《你不知道的javascript上卷》学习笔记(代码片段)

第一部分:作用域和闭包一、作用域1.作用域:存储并查找变量的规则2.源代码在执行之前(编译)会经历三个步骤:分词/此法分析:将代码字符串分解成有意义的代码块(词法单元)解析/语法分析:将词法单元流转换成抽象语... 查看详情

你不知道的javascript(上卷)读书笔记之二----词法作用域

...要的工作类型,一种是词法作用域,一种是动态作用域,Javascript采用的是词法作用域,关于动态作用域的有兴趣的可以自行Google。1.词法阶段         首 查看详情

你不知道的javascript上卷-读书笔记-第2章词法作用域-2.2欺骗词法(代码片段)

你不知道的JavaScript上卷-读书笔记-第2章词法作用域-2.2欺骗词法作用域`eval`和`with`的缺点作用域JavaScript在ES6以前只有函数作用域。ES6开始支持块作用域:通常就是包裹的范围作用域中查找变量or函数的规则是从当前向... 查看详情

你不知道的javascript上卷-读书笔记-第2章词法作用域-2.2欺骗词法(代码片段)

你不知道的JavaScript上卷-读书笔记-第2章词法作用域-2.2欺骗词法作用域`eval`和`with`的缺点作用域JavaScript在ES6以前只有函数作用域。ES6开始支持块作用域:通常就是包裹的范围作用域中查找变量or函数的规则是从当前向... 查看详情

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

...1、理解作用域几个名词的介绍引擎:从头到尾负责整个JavaScript程序的编译及执行过程编译器:负责语法分析及代码生成器等脏活累活作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严... 查看详情

你不知道的javascript(上卷卷)笔记

<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>你不知道的javascript(上卷)</title></head><body></body></html>   查看详情

《你不知道的javascript》整理——this

最近在读一本进阶的JavaScript的书《你不知道的JavaScript(上卷)》,这次研究了一下“this”。当一个函数被调用时,会创建一个活动记录(执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方法、... 查看详情

《你不知道的javascript》整理——作用域提升与闭包

最近在读一本进阶的JavaScript的书《你不知道的JavaScript(上卷)》,里面分析了很多基础性的概念。可以更全面深入的理解JavaScript深层面的知识点。 一、函数作用域1)函数作用域就是作用域在一个“Function”里,属于... 查看详情

《你不知道的javascript》——词法/函数/块作用域

 你不知道的JavaScript(上卷)  视频选集1/4P11.作用域是什么P22.词法作用域P33.函数作用域和块作用域P44.提升                   &nb 查看详情

《你不知道的js(上卷)》作用域闭包(代码片段)

五、作用域闭包:? 闭包不是神奇的魔法,它只是遵循我们前几章一直介绍的词法作用域书写代码的自然结果。? 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。一... 查看详情

《你不知道的javascript》三卷读后感

  本系列的作者是Kyle Simpson,上卷译者赵望野、梁杰,中卷译者单业,下卷译者单业、姜南。  我个人觉得第一卷是本系列最好的(必读),而第二卷虽然也讲解了很多知识点,但是对于异步和性能的那部分提及了信任问... 查看详情