1 js中global对象的含义是什么?它是否真实存在?
2 为什么js中的全局对象是window? 是怎么实现的?
首先看第一个问题,直接在网页中alert(global); 是会出错的,所以这个global对象其实是不存在的,global是一个抽象的概念,代表js中的全局对象,在web中js 的全局对象表现为window. 所以说global是个抽象的概念,而在web中window就是对global的实现,window是可以直接访问的,它是真实存在的,而global是虚拟的,不存在的.
关于第二个问题,为什么js中会有window这个全局变量呢? js只是一种脚本,它所有的意义都是解析器赋与的.所以我们得看解析器是怎么解析window的. 与js对象定义的位置划分js对象可以划分为外部定义对象与内置对象,外部定义对象指的是在js代码中定义的,而内置对象是指在js解析器内部定义的. 在chromium中定义内置对象定义有两种方法,一种是直接在v8引擎中定义,一种是通过v8引擎的扩展文件.idl调用到对应的c++对象,所有的内置js对象都有一个c++对象与之对象. Window js对象是通过widnow.idl中定义的,它的源码在webkitsource/core/frame中. 首先看 window.idl 中定义开头的地方:
[
CheckSecurity=Receiver,
ImplementedAs=DOMWindow,
PrimaryGlobal,
]
ImplementedAs 指定了它的实现 c++类, PrimaryGlobal 指定了window对象是全局的对象,.idl是chromium 中实现扩展js一种机制,简单的说它就是js和c++对象串联起来的一座桥梁,搞清楚.idl机制对于理解内置js对象在webkit中的实现是非常重要的,关于idl详细规则可以参考chromium工程的官方网站(http://www.chromium.org/developers/design-documents/idl-compiler 可能需要梯子) ,它会由python解析成对应的V8window 类,然后v8window的类调用到了继承于DOMWindow的LocalDomWindow. 在js中所有的属性和方法都是源自于window的,所以可以在window.idl 中发现其它所有的 window属性和方法.