第4章 变量、作用域和内存问题

136 阅读3分钟

基本类型和引用类型的值

引用类型拥有动态的属性,可以动态添加、修改、删除;基本类型没有。

复制变量值

引用类型复制变量,复制的是指针,指向的其实是同一个变量。基本类型复制是,是创建一个新的值,不影响原来的变量。

传递参数

函数的参数只能按值传递。(其实就是复制变量值规则)。

function personName(num){    num.name="nihao"}var person=new Object();person.name="wo";personName(person);alert(person.name)  // "nihao"

检测类型

检测基本数据类型:typeof 操作符

检测引用数据类型:instanceof 操作符

var result=variable instanceof constructor 返回true或者false,如person是个引用对象:

person in Object //true

所有引用类型的值都是Object的实例。用instanceof检测基本数据类型,都返回false。

执行环境及作用域

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

在web浏览器中,全局的执行环境被认为是window对象(关闭网页或浏览器时才销毁)。

某个执行环境中的代码被执行完毕,该环境被销毁,其中的变量和函数定义也被销毁。

当代码在执行环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对象执行环境有权访问的变量和函数有序访问(有权访问的都在作用域链中了,有序从内到外)。作用域链的前端始终是当前执行的环境的变量对象,如果当前执行的环境是函数,则将其活动对象作为变量对象(活动对象的第一个变量是arguments)。作用域链的下一个变量对象来自包含(外部)环境,一层层往外,直到最后一个全局环境的变量对象。

函数参数也被当成变量来看,所以访问规则和变量一样。

没有块级作用域

所以在全局中的语句中定义的变量均为全局变量。如:

for(var i=0;i<5;i++){
    document.write(i)
}
alert(i);   //可以这么写,和Java不同

var声明的变量会自动添加到最接近的环境中。没有var则成了全局变量。

查询标识符

由上向下搜索,搜索到时就停止。

垃圾收集

标记清除:进入环境标记下,离开环境标记下

引用计数:涉及BOM和DOM需要用到。容易造成问题,可以把循环引用都设置为null。不懂怎么判断为0次引用???????????

垃圾收集器是周期性运行的,到一定临界值才启动(因此,其实离开执行环境并不是马上被销毁)。如果例程占的内存低,则临界值升高。

在有的浏览器中,可以调用一些方法直接启动垃圾收集器。

管理内存:局部变量在离开执行环境中时会自动被解除引用;全局变量、全局对象的属性和循环引用的变量在没用后可以解除引用(将值设置为null),使其值离开执行环境,以便垃圾收集器下次运行时将其收回。

function rubbish(rg1){    var test=new Object();    test.n=1;    rg1=test.n;    return rg1;}rubbish(2)alert(test.n); //报错。不是因为对象已经被销毁了,是因为没权访问