本文共 1779 字,大约阅读时间需要 5 分钟。
一、值和引用
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);
- alert(b);
- alert(c);
- alert(d.e);
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);
- }
- area2();
- alert(a);
- alert(b);
- }
- 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(h);
- }
- area1(a,b);
- alert(h);
三、垃圾回收
1.一般是自动清理,引擎会每隔一段时间清理一次。其清理依据有标志位或引用次数等。
2.可以手动启动垃圾回收过程:IE window.CollectGarbage();;opera7 window.opera.collect();。
3.系统分配给浏览器的内存很少,所以要优化js代码。一旦数据不用,最好将其值设为null。
转载地址:http://nwkxi.baihongyu.com/