《JavaScript高级程序设计 第三版》学习笔记 (二)执行环境与作用域链

一、值和引用

1.基础类型值:js中五个基础类型unsigned、null、number、boolean、string,这些类型的变量名代表值;把这些变量当作参数传递给函数,解析器会复制一份形参给函数当局部变量用(注意,字符串也是传的值,和其他语言出入比较大)。
2.引用类型值:js的其他类型object、function、array、date(array和date都是object)等,这些类型的变量名代表引用(或者说是没有*的指针);把这些变量当参数传递给函数,相当于传送了对象的引用(指针)复制了一份过去,函数对应的形参类型也是引用(指针)。熟悉C/C++的同学对这个区别肯定非常清楚。
//小实验:
var a=1,b="str",c=[0,1,2],d={e:"abc"};
function test(a1,b1,c1,d1){
	a1=2;
	b1="str2";
	c1[0]=3;
	d1.e=789;
}
test(a,b,c,d);
alert(a);//1
alert(b);//str
alert(c);//3,1,2
alert(d.e);//789
3.变量的复制:清楚了1和2,这个就不难理解了。五大基础类型是复制值到信变量中去,引用类型是赋值地址到新变量中,新老变量指向一个实体。
4.既然函数从形参上面看不出来是值还是地址,就要用typeof检测类型。当然,绝大多数时候返回的都是object,用typeof意义不大,这是需要用instanceof。instanceof的作用是判断某个实例的构造函数是不是指定的。

二、执行环境和作用域

1.执行环境:执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。可以理解为,一个执行环境,是由一对function{}括起来的。虽然这样说不很准确,但注意不是{}括起来,跟C不同。for{}括起来的就不能称作一个执行环境。
2.作用域链:代码执行时,对于某个名称的变量,会创建个作用域链。第一个元素就是当前执行环境(function)中的局部变量,然后依次向外扩张,全局变量永远在最后一个。变量的寻找是按照名字,沿着作用域链一级一级回溯的。如果当前执行环境没有,就搜索下一级,知道搜索完毕。这样的结果就是,在function(执行环境)嵌套后,内层变量会覆盖外层同名变量,同名的局部变量对全局变量有屏蔽作用。
//小实验:
var a=1;
var b=2;
function area1(){
	var a=2;
	function area2(){
		var a=3;
		alert(a);//3 
	}
	area2();
	alert(a);//2
	alert(b);//2
}
area1();
3.JS没有块作用域:在1里面也说了,C是用{}规划作用域的,但js不是。js是用function(){}来规划的。if(){}、for(){}、while(){}这些都不能成为独立的作用域。
4.作用域链是可以延长的:用try或着with。现在很少有人这么用。
5.局部变量不var的危害:使用局部变量不var,这个变量就会被添加到全局环境中,函数执行完之后,还会继续存在。
//小实验:
var a=1,b=2;
function area1(c,d){
	function area2(e,f){
		var g=e+f;
		h=e+f; 
	}
	area2(c,d);
	//alert(g);//抛出g未定义的错误
	alert(h);//3
}
area1(a,b);
alert(h);//3

三、垃圾回收

1.一般是自动清理,引擎会每隔一段时间清理一次。其清理依据有标志位或引用次数等。
2.可以手动启动垃圾回收过程:IE window.CollectGarbage();;opera7 window.opera.collect();。
3.系统分配给浏览器的内存很少,所以要优化js代码。一旦数据不用,最好将其值设为null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值