Fei

JavaScript中引用Global对象

2015-09-22

在 JavaScript 中,所有不属于任何其它对象的属性或方法,都是Global对象的属性或方法。也就是说,没有真正意义上的全局变量或函数,所有在全局作用域中定义的变量或函数都是Global对象的属性或方法。这也是为什么在全局作用域中,不使用var关键字声明的变量能通过delete操作符删除,而使用var关键字声明的变量则不可以。因为对Global对象来说,前者是属性,而后者则不是。

Global对象的另一个特点是无法直接引用。尽管所有浏览器都将Global对象作为window对象的一部分加以实现,但window对象本身还具有许多浏览器对象模型独有的属性和方法。《JavaScript 高级程序设计》第三版中通过如下方式取得对Global对象的引用:

// Page 134
var global = (function() {
  return this
})()

但在严格模式下,this值等于undefined。那么如何确保始终正确引用Global对象?

;(function() {
  console.dir(this) // window
})()

;(function() {
  'use strict'
  console.dir(this) // undefined
})()

;(function(global) {
  console.dir(global) // window
})(this)

;(function(global) {
  'use strict'
  console.dir(global) // window
})(this)

显然,不管是在支持严格模式的浏览器下,还是在不支持严格模式的浏览器下,始终将this值作为参数传递给立即执行函数能够确保正确引用global对象。

var global = (function(global) {
  'use strict'
  return global
})(this)