04 变量、作用域和内存问题

4.1 基本类型和引用类型

基本类型5中:

  • Undefined

  • Null

  • Number

  • String

  • Boolean

动态的属性

引用类型的属性可以在对象创建好后动态添加

var person = new Object();
person.name = "Leo";
alert(person.name); // Leo

类型检测

对于基本类型,用typeof就行了。但对于对象,typeof总返回object,而我们还想直到对象是什么类型的对象。这是就需要使用instanceof

alert(person instanceof Object); // true

4.2 执行环境及作用域

执行环境

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

web浏览器中,全局执行环境是window对象。所有全局变量和函数都是作为window对象的属性和方法创建的。每个函数都有自己的执行环境。

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

没有块级作用域

if (true) {
var color = "blue";
}
alert(color); // "blue"
for (var i = 0; i < 10; i++) {}
alert(i); // 10

注意这里说的块显然不包括函数,因为函数有自己的执行环境

function func () {
var a = 1;
}
alert(a); // Uncaught ReferenceError: a is not defined

4.3 垃圾收集

js有自动垃圾收集机制,其原理就是找出不再使用的变量,然后释放其占用的内存。

在浏览器中,一般有两种实现策略:

  • 清除标记

    这是目前主流的垃圾收集方法。这种方法给当前不使用的值加上标记,然后再回收其内存。

  • 引用计数

    类似linux中文件的引用计数。但是在代码中要特别注意循环引用,这会导致引用计数出问题。