对JavaScript中全局对象和作用域的一点点理解
在JavaScript中我们可以通过constructor来判断对象的类型。
如:arr.constructor == Array;
但不同的frame(或窗体)中判断时就会失效了,因为这时同样的对象有了不同的constructor。
开始不是很理解,认真学习了作用域后有了一些认识。
先看一个例子。
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2
<HTML>
3
<HEAD>
4
<TITLE> Scope of function </TITLE>
5
</HEAD>
6
<BODY>
7
<SCRIPT LANGUAGE="JavaScript">
8
function scope1(){
9
function User(){
10![]()
11
}
12
this.user1 = new User();
13
}
14
function scope2(){
15
function User(){
16![]()
17
}
18
this.user2 = new User();
19
}
20
var s1 = new scope1();
21
var s2 = new scope2();
22
alert(s1.user1.constructor == s2.user2.constructor);
23
</SCRIPT>
24
</BODY>
25
</HTML>
26![]()
27![]()

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

运行后弹出结果为false,也就是s1中的user1和s2中的user2的类型不同,但user1和user2都是User对象,且scope1和scope2中的User对象完全一样。
对于这种现象可以解释为两个User在不同的作用域下,所以他们的constructor是不同的。
从此可联想到在不同的frame或窗体中相同的对象的constructor不同,也是因为他们的作用域不同。
所以可以认为每个frame或窗体在运行时都会创建一个function,frame或窗体中的任何对象的作用域(即全局作用域)都在这个function中。
当然此处理解为创建一个function是由上面的例子联想到,实际上在每个frame或窗体创建时javascript解析器会初始化创建一个全局对象global object,这个全局对象拥有一些预定义的全局变量和全局方法,如Infinity, parseInt, Math,在此frame或窗体中定义的所有全局变量都是这个全局对象的属性。这个全局对象就是window。