JavaScript高级程序设计【第四章】 读书笔记

1.java的类型

1)基本类型(5种保存在栈中)

Undefined,Null,Boolean,Number和String  ,注意String不是引用类型,和很多语言不同。也就是说js的String是固定大小的。有趣的是,当类型检查的时候Null居然是Object类型,typeof检查基本类型的实例,instanceof检查引用类型的实例。

2)引用类型(保存到堆中)

也就是说,这个类型的空间可大可小不是固定的。

3)全局执行环境被认为是window对象

4)延长变量的作用域  with和try……catch

后者很好理解,前者请见例子。

5)怪异的现象

  a)没有块作用域,见例子中的if和for

  b)函数内不声明直接使用变量(杯具用法),见例子。

1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2  <html>
3  <head>
4  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5  <title>Insert title here</title>
6  </head>
7  <body>
8  <script type="text/javascript">
9 //引用类型
10   var person = new Object();
11 person.name = "lee";
12 document.write(person.name);
13
14 var girl = new Object();
15 girl = person;
16 girl.name = "alex";
17 document.write(person.name);
18 //基本类型
19
20 var name1 = "lee";
21 var name2 = name1;
22 name2 = "alex";
23 document.write(name1);
24 document.write(name2);
25 //函数类似
26
27 function reference(obj){ //注意参数没有类型
28
29 var girl = new Object();
30 girl = obj;
31 girl.name = "alex";
32 }
33 var person = new Object(); //person 并没有提及name属性的事情
34 reference(person);
35 document.write("</br>");
36 document.write(person.name);
37
38 //类型检查,有趣的是null居然是object类型的
39 var n1 = null;
40 var boy = new Object();
41 document.write(typeof n1);
42 document.write(typeof boy);
43
44 document.write("<br>");
45 document.write(n1 instanceof Object);
46 document.write(boy instanceof Object);
47 document.write(null instanceof Object);
48
49 //with提高变量的作用域,相当于提高了一级
50 var friend = new Object();
51 friend.txt = " js";
52 function limit(){
53 var s1 = "hello";
54 document.write("<br>");
55 with(friend){
56 var s2 = s1 + txt;
57 }
58 document.write(s2);
59 }
60 limit();
61 //document.write(s2); 会报错
62
63 // *没有块级作用域,不会销毁对象。if for均是。
64 if(true){
65 var v3 = 3;
66 }
67 document.write(v3);
68
69 for(var i=0;i<11;i++){ //注意是var,我写成int了
70 //居然不销毁i
71 }
72 document.write(i); //猜猜i的值,11猜对没?
73
74 //*声明变量时的怪异现象
75 function god(int1,int2){
76 var int3 = int1 + int2;
77 }
78 god(1,1);
79 //document.write(int3); //会报错,意料之中
80
81 document.write("<br>++++++++");
82
83 function god2(int1,int2){ //不报错,情理之外
84 int4 = int1 + int2;
85 }
86 god2(1,1);
87 document.write(int4); //居然还提高了作用域,莫非是李刚的儿子?
88 //由此可见,不声明变量直接使用有多杯具。
89
90 </script>
91 </body>
92 </html>

2.js循环引用问题和解决办法。

1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <title>Insert title here</title>
6 </head>
7 <body>
8 <script type="text/javascript">
9
10 //导致循环引用问题,即使页面关闭,两个变量也不会得到释放,由js的垃圾收集机制所决定。
11 var element = document.getElementById("someId");
12 var object = new Object();
13 object.element = element;
14 element.someObject = object;
15
16 //解决办法
17 object.element = null;
18 element.someObject = null;
19
20 </script>
21 </body>
22 </html>

两种浏览器触发垃圾收集器的方法:

//ie代码调用垃圾收集器
window.CollectGarbage();
//pera代码调用垃圾收集器
window.opera.collect();

3.管理js内存,虽然有垃圾收集器,但是我们为了达到使用最少的内存,让用户达到最高的性能,所以仍然需要手工管理内存。局部变量在离开环境时将自动释放,而大部分全局变量和全局对象属性,在垃圾收集器执行工作前,最好让我们手动标记释放。释放的方法异常简单,将变量的值设置为null,这种做法叫做解除引用。

posted @ 2011-05-04 01:37  NeverLand2011  阅读(337)  评论(2)    收藏  举报