第4章 作用域和内存问题

4.1基本类型和引用类型的值

变量包含两种不同数据类型的值:基本类型值和引用类型值,前者是简单的数据段,后者指那些可能由多个值构成的对象

4.1.1动态的属性

引用类型的值可以为其添加属性和方法,也可以改变和删除其属性和方法,基本类型值不能添加属性

4.1.2复制变量值

var num1 = 5;

var num2 = num1;

num2 也保存了值5,而且与num1中的是完全独立的

var obj1 = new Object();

var  obj2 = obj1;

obj.name =“xiaohong”;

alert(obj2.name);// "xiaohong"

复制引用类型的值时,这个值的副本实际上是一个指针,指向存储在堆中的一个对象,改变其中一个变量就会影响另一个变量

4.1.3 传递参数

所有函数的参数都是按值传递的,基本类型值的传递如同基本类型变量的复制一样,引用类型值的传递如同引用类型变量复制一样。向参数传递基本类型的值时,被传递的值会复制给一个局部变量即命名参数,向参数传递引用类型的值时会吧这个值在内存中的地址复制给一个局部变量。案例见p70

4.1.4 检测类型

typeof 常用来检测基本数据类型,引用类型用instanceof操作符

alert(person instanceof Object);

alert(person instanceof Array);

alert(person instanceof RegExp);

4.2 执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据

全局执行环境的变量对象始终都是作用域连中的最后一个对象。

4.2.1 延迟作用域链

执行下面两个语句时,作用域链会得到加长:

try-catch语句的catch块

with 语句

4.2.2 没有块级作用域

c语言由花括号封闭的代码块都有自己的作用域,如if语句、for语句的代码块,但js里面没有。

4.3 垃圾收集

垃圾收集机制原理:找出那些不再继续使用的变量,然后释放其占用的内存

标记清除:变量进入执行环境标记为“进入环境”,变量离开环境时,标记为离开环境,一段时间后消除那些标记的变量

引用计数:当声明了一个变量并赋值一个引用类型值,引用次数+1,同一个值付给另一个变量时+1,当引用这个值的变量又取得另一个值时-1

原文地址:https://www.cnblogs.com/wwjdx/p/6151929.html