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

javascript很重要,一定要学好,把基础的知识点掌握了,才能学的更透彻!学习要有求知欲。知其然,知其所以然!

这里的笔记主要是用于平常的知识回顾~

第一章 作用域是什么?

1.在传统编译语言的流程中,程序中的一段源码在执行之前会经历三个步骤,统称为“编译”。这三个阶段分别为:

  • 词法分析(分词)
  • 语法分析(解析)
  • 代码生成

2.变量的赋值操作会执行两个动作,首先,编译器会在当前作用域中声明一个变量(如果之前没有声明),然后在运行时引擎会在作用域中查找该变量。如果能够找到,就会对其赋值。

3.当变量出现在赋值操作的左侧时,进行LHS查询,出现在右侧时进行RHS查询。

4.如何判断是LHS还是RHS:

LHS:赋值操作的目标是谁

RHS:谁是赋值操作的源头

5.遍历嵌套作用域链的规则:引擎从当前的执行作用域开始查找变量,如果找不到,就往上一级继续查找,当抵达最外层的全局作用域时,无论找到与否,都会停止。

6.对ReferenceError和TypeError的区分:

扫描二维码关注公众号,回复: 3094866 查看本文章
  • ReferenceError同作用域判别失败相关
  • TypeError则代表作用域判别成功了,但是对结果的操作是非法或不合理的

第二章 词法作用域

1.作用域的两种工作模型:

  • 词法作用域(JS属于此种)
  • 动态作用域

2.作用域查找会在找到第一个匹配的标识符时就停止,在多层的嵌套作用域中可以定义同名的标识符,称为“遮蔽效应

3.全局变量会自动生成全局对象(比如浏览器的window对象)的属性。

通过这种技术可访问那些被同名变量所遮蔽的全局变量,但非全局的变量如果被遮蔽了,无论如何都无法访问到。

4.欺骗词法作用域的两种机制:

  • eval():接受一个字符串参数,将其中的内容视为在书写时就存在于程序中这个位置的代码
  • with关键字,可以将一个没有或多个属性的对象处理为一个完全隔离的词法作用域。

eval()函数如果接受了含有一个或多个声明的代码,就会修改其所处的词法作用域,而with声明实际上时根据传递给它的对象,凭空创建了一个全新的词法作用域

5.欺骗词法会影响性能,使代码运行慢。

因为js引擎会在编译阶段进行数项性能优化,有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有的变量和函数的定义位置,才能在执行过程中快速找到标识符。但如果引擎在代码中发现了eval()或with,只能简单地假设关于标识符位置的判断都是无效的。

猜你喜欢

转载自blog.csdn.net/tozeroblog/article/details/81436837