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

来源:互联网 发布:mac网游 编辑:程序博客网 时间:2024/04/28 01:26

一、值和引用

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

二、执行环境和作用域

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

三、垃圾回收

1.一般是自动清理,引擎会每隔一段时间清理一次。其清理依据有标志位或引用次数等。
2.可以手动启动垃圾回收过程:IE window.CollectGarbage();;opera7 window.opera.collect();。
3.系统分配给浏览器的内存很少,所以要优化js代码。一旦数据不用,最好将其值设为null。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高考不会写作文怎么办 孩子总是写错字怎么办 小孩总是写错字怎么办 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办? 苗木抵扣计算错误怎么办 表格中计算错误怎么办 孩子电视瘾太大怎么办 孩子考试前失眠怎么办 孩子上网瘾了怎么办 孩子考试差家长怎么办 手指肿痛有脓包怎么办 手指脓出来红肿怎么办 手指提重物发麻怎么办 小孩拧伤了怎么办 从小就成绩差怎么办 孩子考试总马虎怎么办 上课不认真怎么办初中 对学习兴趣不大怎么办 小学生做作业粗心大意怎么办 小学生考试总是粗心大意怎么办 脚趾内侧长鸡眼怎么办 五岁宝宝胆小怎么办 孩子偏食挑食老师怎么办 九岁孩没有耐心怎么办 孩子学习太粗心怎么办 害怕自己变疯怎么办 工作太粗心了怎么办 粗心的宝宝该怎么办 孩子身上起范怎么办 又笨又内向怎么办 学生做试卷马虎怎么办 小孩子学习态度不好怎么办