JavaScript高级程序设计第四章知识点总结

第四章 变量、作用域和内存问题

本章内容

  1. 理解基本类型和引用类型的值
  2. 理解执行环境
  3. 理解垃圾收集

JS变量松散类型的本质,决定了它只是再特定时间用于保存特定值的一个名字而已。

4.1 基本类型和引用类型的值

基本类型指的是简单的数据段,引用类型指的是那些可能由多个值构成的对象。

五种基本数据类型:Undefined、Null、Boolean、Number和String。这五种基本数据类型是按值访问的。

引用类型的值是保存在内存中的对象。在操作对象时,实际上是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。下面介绍其他几点不同。

4.1.1 动态的属性

对于引用类型我们可以为其添加属性和方法,但是对于基本类型不能有这样的操作。

4.1.2 复制变量值

除了保存的方式不同之外,复制的时候也不一样。

基本类型:

如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。

复制后的两个值是完全独立的,参与任何操作时不会互相影响。

引用类型:

复制的值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中的一个变量,就会影响另一个变量。

4.1.3 传递参数

4.1.4 检测类型

Typeof操作符用来检测基本类型的值(如果变量的值是一个对象或null,会返回object),Instanceof操作符用来检测引用类型的值。

4.2 执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据。每个执行环境都有一个与之关联的变量对象。环境中定义的所有变量和函数都保存在这个对象中。

执行环境的建立分为两个阶段:进入执行上下文(创建阶段)执行阶段(激活/执行阶段)。其中,进入上下文阶段发生在函数调用时,但在执行具体代码之前。具体完成创建作用域链;创建变量、函数和参数以及求this的值。执行代码阶段主要完成变量赋值、函数引用和解释/执行其他代码。

在Web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。

涉及到的概念:

变量对象:在进入执行上下文时,变量对象处在初始化阶段,包含三个属性:函数的形参、函数声明、变量声明;在代码执行阶段,变量对象中的一些属性值会得到确定。

活动对象:函数被调用时,一个特殊的对象-活动对象被创建。这个对象包含形参和argument对象,之后会作为函数上下文的变量对象来使用。也就是说,活动对象中除了变量和函数,还存储了形参和arguments对象

当代码在一个环境中执行时,会创建变量对象的一个作用域链作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。整个作用域链本质上是一个指向变量对象的指针列表,它只引用但是不实际包含变量对象。作用域链的最前端,始终是当前正在执行的代码所在环境的变量对象。全局执行环境的变量对象始终都是作用域链中的最后一个对象。

内部环境可以通过作用域链访问到所有的外部环境,但是外部环境不能访问内部环境的所有变量和函数。每个环境都是向上搜索作用域链。

4.2.1 延长作用域链

延长作用域链是在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。能够延长作用域链的两种情况:

try-catch语句的catch块:会创建一个新的变量对象;

with语句:会将指定的对象添加到作用域链中

4.2.2 没有块级作用域

JS没有块级作用域的概念,所以在JS中,变量声明会将变量添加到当前的执行环境,当代码退出花括号后,变量不会被销毁,仍然存在于全局执行环境中。

  1. 声明变量

使用var声明的变量会被自动添加到最接近的环境中。如果初始化变量时,没有使用var声明,则该变量会自动被添加到全局环境中

  1. 查询标识符

当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到,搜索停止,变量就绪。也就是说,如果局部环境中存在着同名的标识符,就不会使用位于父环境中的标识符。

若想访问全局环境中的同名标识符,则可以window.color。

猜你喜欢

转载自blog.csdn.net/weixin_42734488/article/details/81156402