JavaScript高级程序设计学习笔记——变量、作用域和内存问题(重要)

1、基本类型和引用类型的值

  JS变量可以用来保存两种类型的值:基本类型值和引用类型值。

 (1)基本类型值:指的是简单的数据段,主要来源是五种基本数据类型,这5种基本数据类型是按值访问的,因此可以操作保存在内存中的实际的值;

 (2)引用类型值:指的是那些有可能由多个值构成的对象,是保存在内存中的对象,引用类型的值是按引用访问的,在JS中不允许直接访问对象的内存空间,在操作对象时,实际上是操作对象的引用,而不是实际的对象。 

 (3)二者的比较:


基本类型值
引用类型值
值的来源
五种基本数据类型
保存在内存中的对象
访问类型
按值访问
按引用访问
定义方式(二者相同)
创建变量,赋值
创建变量,赋值
动态添加属性 不可
可以
复制变量值
复制后两变量独立,操作互相无影响
复制的副本实际是一个指针,两个变量实际引用的同一个对象,两变量互相影响
传递参数(相同)
按值传递 被传递的值被复制给一个局部变量,修改参数值,不影响函数外部的变量
按值传递 将该引用类型值在内存中的地址复制给一个局部变量,局部变量的变化会反映在函数的外部,参数会按引用来访问同一个对象;注意:即使在函数的内部修改参数值,但原始的引用保持不变。
检测类型
typeof检测数据类型,结果返回数据类型
instanceof检测对象,检测基本类型值则返回false,检测引用类型值或object构造函数则返回true。

2、执行环境及作用域

(1)执行环境:定义了变量或函数有权访问的其它数据,决定了它们各自的行为。

  • 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

  • 执行环境有全局执行环境和函数执行环境之分,某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。

  • 全局执行环境被认为是window对象。

  • 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境会被推入一个环境栈,函数执行完后,栈将其环境弹出,控制权返回之前执行环境。

(2)作用域    

  • 作用域链,是保证对执行环境有权访问的所有变量和函数的有序访问。

  • 作用域链的前端,始终是当前执行代码所在环境的变量对象,下一个变量对象来自外部环境,再下一个依次向外,最后延续到全局执行环境。

  • 函数的局部环境有权访问函数作用域中的变量,有权访问其包含(父)环境,乃至全局环境;

  • 全局环境只能访问在全局环境中定义的变量和函数,不可直接访问局部环境中的任何数据;

  • 作用域链只可向上搜索不可向下搜索;搜索中,如果存在一个局部的变量的定义,则搜索自动停止,不再进入另一个变量对象;

  •  延迟作用域链长度的方法:try-catch语句的catch块;with语句;

  • JS中没有块级作用域,即if/for等中变量的声明会将变量添加到最近的环境即当前执行环境,若未用var声明,则被添加到全局环境;

3、垃圾收集

JS具有自动垃圾收集机制,不必关心内存分配和回收问题。

  • 离开作用域的值自动标记为可回收,在垃圾收集期间被删除;

  • “标记清除”是目前主流的垃圾收集算法,该算法思想是给当前不使用的值加上标记,然后再回收其内存;

  • “引用计数”目前引擎都不再使用;

  • 解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集有好处,为了确保有效地回收内存,应及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。


你可能感兴趣的:(学习笔记)