变量,作用域和内存的问题
(1)基本类型和引用类型:
1》对于基本操作类型来说是按值访问的,因此可以操作保存在变量里面的实际的数值。
对于引用类型来说不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,在操作对象的时候其实就是在操作对象的引用,不是实际的对象。
2》对于引用类型来说可以直接给它添加或者是删除属性。添加的属性不进行删除或者是销毁的话,添加的属性会一直存在的。但是,对于基本类型来说是不可以给他动态的添加属性的。
3》对于基本变量来说这里复制变量的时候会给分配新的内存,在对象变量上创建新值然后把该值复制到新变量分配的内存上,新的变量和旧的变量是相互独立的。对于引用类型来说这里将存储在变量对象中的值复制一份放在新变量分配的内存中的。但是其中的副本相当于一个指针,这个指针指向存储在堆中的一个对象,复制结束后两个变量想打想相当于引用同一个对象,改变其中的一个变量就会影响另外一个变量。
总的来说就是都会分配显得内存,只不过对于基本类型来说两个变量之是相互独立的,对于引用类型来说,两个变量之间不是相互独立的。
》4对于其中的基本类型还是引用类型,其中的传递参数和其中的复制是一样的效果。对于其中的引用类型来说这里有一个特殊的地方。
function setName(obj){
Obj.name=”liy”;
Obj = new Object();
Obj.name=”wang”;
}
var person = new Object();
SetName(person);
alert(person.name); // liy
想不到吧!这里返回来的竟然是liy.原因就是在函数里面新创建的obj是局部变量,这里在函数结束的时候,局部变量就会被销毁。
(2). 检测类型:
typeof是用来检测字符串,数值,布尔值,还是undefined的最佳工具。如果是null或者对象的话,就都会返回的是object.
Instanceof:其中在检测一个引用类型值和object构造函数的时候。instanceof会返回true,对于基本类型来说其中返回的是false.
3.对于执行环境和作用域来说:
全局执行环境是:window对象
每一个执行环境都有一个与之关联的变量对象
每一个执行环境中的所有代码执行完毕之后该环境被销毁,保存在其中的所有的变量和函数也会被销毁。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推进一个环境栈中。每当函数执行之后,栈将其环境弹出,把控制权返回给之前执行的环境。
作用域链
在这里需要注意的就是:
1. 对于一个环境变量来说可以访问父级里面的变量,但是父级不能访问子级里面的东西了。
2. 其中寻找变量的时候会先在自己的环境里面寻找,如果找不到的话才会在父级环境里面寻找。
3. 在一个作用域里面:先将其中的变量,函数提前,然后才会逐行解析。在逐行解析之前,访问环境里面的变量的时候都会返回的是undefined.只有在逐行解析的过程中如果给变量进行赋值之后,你在访问其中的变量的时候才会返回其中的值。
4. 传进去的参数,相当于在该环境里面创建了新的局部变量。
延长作用域
1. with的方法
2. Try-catch
两个语句都会在作用域的前端添加变量对象。with将指定的对象添加到作用域链中。对于catch语句来说,会创建新的变量。
(3).垃圾收集机制:
js具有自动垃圾回收机制。
原理:找出那些不在继续使用的变量,然后释放内存。垃圾回收机制会按照固定的时间周期性的执行这一操作的。
方法:标记清除,引用计数
性能问题:IE里面对于垃圾回收机制来说到达其中的临界值的时候。垃圾回收机制才会进行工作。这就导致其中的性能大大降低。
随着IE7这种愚蠢的做法。垃圾回收机制变成动态的了。如果垃圾回收的内存低于15%临界值就会加倍。达到内存的85%的时候,其中就会将各种临界值设置为默认值。
(4)管理内存:
分配给浏览器的可用内存数量比较小。因为其中的内存限制变量的数量,还会影响调用栈以及在一个线程中能够同时执行的语句的数量。所以我们可以手动解除引用。将其中的值设置为null(这是对于全局变量的和全局变量的属性的)。对于局部变量来说,他自己会自动解除。