博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《JavaScript高级程序设计 第三版》学习笔记 (二)执行环境与作用域链
阅读量:4157 次
发布时间:2019-05-26

本文共 1779 字,大约阅读时间需要 5 分钟。

一、值和引用

1.基础类型值:js中五个基础类型unsigned、null、number、boolean、string,这些类型的变量名代表值;把这些变量当作参数传递给函数,解析器会复制一份形参给函数当局部变量用(注意,字符串也是传的值,和其他语言出入比较大)。
2.引用类型值:js的其他类型object、function、array、date(array和date都是object)等,这些类型的变量名代表引用(或者说是没有*的指针);把这些变量当参数传递给函数,相当于传送了对象的引用(指针)复制了一份过去,函数对应的形参类型也是引用(指针)。熟悉C/C++的同学对这个区别肯定非常清楚。
[javascript]   
  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]   
  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]   
  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。

转载地址:http://nwkxi.baihongyu.com/

你可能感兴趣的文章
Tair ldb(leveldb存储引擎)实现介绍
查看>>
通过apache/nginx禁止访问.svn目录
查看>>
C++性能优化技术导论
查看>>
SQL-92定义的errorcode 通过PDO什么的返回的值~
查看>>
linux 终端控制 颜色/位置 man console_codes
查看>>
深入了解php底层机制
查看>>
打开general_log 记录所有的sql
查看>>
原来打补丁是这么玩儿。。。diff patch
查看>>
51cto 均衡负载专题 收藏
查看>>
为什么程序员的社会地位不高?
查看>>
Binary_search_tree from wikipedia
查看>>
给你的Linux系统上点stress
查看>>
学了学shell,钻个牛角尖,根据接口文档生成配置数组...awk sed xargs
查看>>
给wordpress加个特色头像
查看>>
BitMap初探
查看>>
Google Reader快捷键
查看>>
由12306.cn谈谈网站性能技术
查看>>
MySQL DELAY_KEY_WRITE
查看>>
地球重力为什么没把我们压碎掉?
查看>>
记一次TIME_WAIT网络故障
查看>>