你不知道的Javascript小结

   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的迷惑。

原文地址:https://www.cnblogs.com/unbreakable/p/2637360.html