变量、作用域和内存问题
-
变量
JavaScript变量可以用来保存两种类型的值:基本类型和引用类型
- 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中
- 引用类型的值是对象,保存在堆内存中
- 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
- 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
- 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象
- 确定一个值是哪种基本类型使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符
-
作用域
所有变量都存在于一个执行环境中,执行环境决定了变量的生命周期
- 执行环境分为全局环境和函数执行环境
- 函数的局部环境可以访问父环境,全局环境不能访问局部环境
- 变量的执行环境有助于确定应该何时释放环境
-
内存问题
JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存。
-
标记清除
当变量进入环境时,就将这个变量标记为“进入环境”,当变量离开环境时,将其标记为“离开环境”
-
引用计数
跟踪记录每个值被引用的次数。JavaScript引擎目前不再使用。当代码中存在循环引用现象时,“引用计数”会导致问题
-
解除变量
有助于消除循环引用现象,对垃圾收集也有好处