变量、作用域和内存问题
ECMAScript 数据类型
基本类型(5种):
-
Undefined
,Null
,Boolean
,Number
,String
-
typeof()
检测一个变量是否是基本数据类型 - 基本类型在内存中占据固定大小的空间,因此被保存在 栈 内存中。
- 从一个变量向另一个变量复制 基本类型 的值,会创建这个值的一个副本。
引用类型:
- 保存在内存中的对象。
- 引用类型的值是对象,保存在 堆 内存中。
-
instanceof()
检测是什么类型的对象alert (color instanceof Array) // true or false alert (persion instanceof Object) // true
- 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。
- 从一个变量向另一个变量复制 引用类型 的值,复制的其实是指针,因此两个变量最终都指向同一个对象。
执行环境及作用域
所有变量(包括基本类型和引用类型)都存在于一个执行环境当中,这个执行环境(也称为作用域)决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。
执行环境的类型有两种:
- 全局(全局执行环境)
- 局部(函数执行环境)
每个环境都可以向上搜索作用域链,以查询变量和函数名;但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。(内部可通过作用域链访问外部,外部不能访问内部)。
延长作用域链
当执行流进入下列任何一个语句时,作用域链就会得到加长:
-
try-catch
语句的catch
块 -
with
语句
没有块级作用域
对于 javascript 来说,由 for 语句创建的变量 i 在 for 循环结束后,也依旧存在于循环外部的执行环境中。
for (var i =0; i < 10; i++) {
doSomething(i);
}
alert(i); //10
-
声明变量:
- 使用 var 声明:添加到最接近的环境中。
- 不用 var 声明,自动添加到全局环境。所以建议一定要先声明。
-
查询标识符:
- 从作用域的前端开始,向上逐级查询与给定名字匹配的标识符。
垃圾收集
JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。
原理:找出那些不再使用的变量,然后释放其占用的内存。垃圾回收器会按照固定的时间间隔周期性的执行这一操作。
通常有两个策略:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。