ECMA-262对内置对象的定义是:"由ECMAScript实现提供的,不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了."意思就是说,开发人员不必显示的实例化内置对象;因为他们已经实例化了.ECMA-262只定义了两个你内置对象:Global和Math.
Global(全局)对象可是说是ECMAScript中最特别的一个对象了,以为不管你从什么角度上看,这个对象都是不存在的.ECMAScript中的Global对象在某种意义上是作为一个终极的"兜底儿对象"来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是他的属性和方法。事实上,没有全局变量或全局函数;所有在全局域中定义的属性和函数,都是Global对象的属性.例如IsNaN() , ParseInt()和parseFloat()
ECMAScript虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个对象作为Window对象的一部分加以实现的。因此,在全局作用域中申明的所有变量和函数,就都成为了window对象的属性.
--摘录于Javascript高级程序设计第128页
从上面描述中,我们可以总结出我们经常用的parseInt()和parseFloat().... 。但他们并不是window对象下面的属性.而我们用for-in语句枚举window对象的属性时是枚举不出parseInt()...和parseFloat().....的。进而有证明了作者所说的一句话" ECMAScript虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个对象作为Windo对象的一部分加以实现的 ".
那么我们再看下面的例子
var say = "早上好"; function sayHello(){ console.log(window.say); } window.sayHello(); //输出早上好
我们将这段代码放置全局作用域中,无论是变量或者函数我们都可以再前面加"window"访问的到.可能现在大家又迷惑了,在全局作用域中声明的变量和函数真的是window对象的属性嘛?那么继续往下看....
var say = "早上好"; function sayHello(){ console.log(window.say); } var result = delete window.sayHello; var result2 = delete say; console.log(result); //false console.log(result2); //false
从上面的例子我们可以看出虽然我们在全局作用中可以用"window"+变量名(函数名)访问某个变量或者函数,但这些变量和函数并不是window下的属性,实质是Globa对象的属性.
这里我们将上面的代码放在firebug下,
var say = "早上好"; function sayHello(){ console.log(window.say); } var result = delete window.sayHello; var result2 = delete say; console.log(result); //true console.log(result2); //true
可能在firebug的环境下,firebug做了不同了处理才返回true的,但实质还是返回false的。我也是从<Javascript高级程序设计>中总结出来了,这本书解决了我不少对于Javascript的迷惑。