对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

 

运行后弹出结果为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。

posted @ 2009-03-07 23:00  zhyt1985  阅读(817)  评论(0编辑  收藏  举报