变量、作用域和内存题目
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 具有自动渣滓网络机制,也就是说,实行环境会担任治理代码实行过程当中运用的内存。
道理:找出那些不再运用的变量,然后开释其占用的内存。渣滓接纳器会根据牢固的时候距离周期性的实行这一操纵。
一般有两个战略: