JavaScript高级程序设计--变量、作用域和内存问题

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

基本类型值: 简单的数据段(Undefined Null Boolean Number String),保存在栈内存中
引用类型值: 可能有多个值构成的对象(Object),保存在堆内存中

关于操作对象:赋值保存着对象的某个变量时,操作的是对象的引用;为对象添加属性时,操作的是实际的对象

1.1 传递参数

所有函数的参数都是按值传递
看两个栗子:

function setName(obj){
	obj.name="Nicholas";
}
var person = new Object();
setName(person);
// person.name "Nicholas"

person 因为按值传递被复制到函数内的obj, 而对象复制后实际都指向堆内存内的同一个对象,所以person 和 obj引用同一个对象,所以函数内改obj属性person相应属性值也改变

function setName(obj){
	obj.name="Nicholas";
	obj=new Object();
	obj.name="Greg";
}
var person = new Object();
setName(person);
// person.name "Nicholas"

证明按值传递,obj对象会在函数执行完毕后被摧毁

2 执行环境和作用域

执行环境分为全局执行环境和局部执行环境:
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中,例如全局执行环境是window对象,直到应用程序退出,比如关闭网页和浏览器才会被销毁
每个函数都会有它的执行环境

当代码在一个环境中执行时,会创建变量对象的一个作用域链(可用于搜索变量和函数)。作用域链的前端,是当前执行的代码所在环境的变量对象,如果这个环境是函数,就将其活动对象(最开始只包含arguments对象)作为变量对象。作用域链的下个变量对象包含(外部)环境,window对象始终是作用域链的最后一个对象。

2.1 没有块级作用域

for(var i=0;i<10;i++){
	dosomething(i);
}
// i 10

2.2 查询标识符(变量与函数)

沿着作用链向上搜索,先找局部环境,再向上搜索,一直追溯到全局环境的变量对象。

3 垃圾收集

管理内存中的解除引用

var a=new Object();
//一系列操作之后用不到a了
a = null;

为了确保有效回收内存,应该及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用。

发布了14 篇原创文章 · 获赞 0 · 访问量 498

猜你喜欢

转载自blog.csdn.net/yichen_adf/article/details/104146272