变量
基本类型值 | 简单的数据段 Undefined Null Boolean Number String |
1. 按值访问的(可以操作保存在变量中的实际的值) 2. 保存在栈内存 3. 复制变量值(创建一个新值) 4. 确定哪种基本类型(typeof) | |
引用类型值 | 保存在内存中的对象 |
1. 按引用访问的(操作对象的引用,而不是操作实际的对象) 2. 保存在堆内存 3. 动态添加属性 4. 复制变量值(复制的是指针,不同变量引用同一个对象) 5. 确定哪种引用类型(instanceof) |
l 所有函数的参数都是按值传递的。
l 在局部作用域中修改的对象会再全局作用域中反映出来,就说明参数是按引用传递的(×) P71
检测类型
typeof | 字符串 string 数值 number 布尔值 Boolean undefined object(对象,null) |
instanceof | person instanceof Object 对象 person instanceof Array 数组 pattern instanceof RegExp 正则 |
作用域
所有变量(基本类型、引用类型)都存在于一个执行变量(作用域)
l 执行环境(全局环境函数执行环境)
l 每进入一个新的环境,创建一个作用域链
l 函数的局部环境,有权访问函数作用域中的变量,有权访问其包含环境,直至全局环境。
l 全局环境只能访问在全局环境中定义的变量和函数,不能直接访问局部环境中的任何数据。
l 变量的执行环境,有助于确定合适释放内存。
执行环境/环境 |
执行环境 → 变量对象(环境中定义的所有变量、函数) |
全局执行环境 (最外围的一个执行环境 web浏览器中为window对象) |
环境中代码执行完 → 环境销毁 →变量对象(环境中定义的所有变量、函数)销毁 |
每个函数 → 自己的执行环境 |
环境中代码执行 → 创建变量对象的作用域链(函数,活动对象作为变量对象 arguments对象) |
下一个变量对象来自外部环境,一直到全局环境 |
标识符解析:沿着作用域链一级一级地搜索标识符的过程 |
延长作用域链
1. Try-catch语句的catch块(IE8有问题)
2. With语句
JS没有块级作用域
l 即使在for循环结束后,i也依旧存在于循环外部的执行环境中。
l 适用var声明的变量,自动添加到最接近的环境中。
l 没有var声明的变量,自动添加到全局环境。
JS自动垃圾收集机制
标记清除 | 最主流的垃圾收集算法,不适用的值加上标记,然后收回内存 |
引用计数 | 跟踪记录所有值被引用的次数。 IE中非原生JS对象(DOM对象),有问题 循环引用,有问题 |