本文深入解析JavaScript中的全局对象机制,区分浏览器环境下的window对象与JS原生全局对象。重点阐述this关键字在非严格模式与严格模式下的不同指代逻辑,并提供通过代码判断当前执行环境是否启用严格模式的实用技巧。
JavaScript全局对象的核心功能
任何JavaScript程序启动时,解释器都会自动初始化一个全局对象供程序调用。该全局对象内置了多项核心功能。
1.全局对象拥有一些常用的属性值。比如undefined、Infinity以及NaN。 2.全局对象拥有一些常用的属性对象。比如Math、JSON和Number对象均为该全局对象的属性。 3.全局对象提供一些全局函数供调用。比如isNaN()、isFinite()、parseInt()和eval()等。 4.全局对象提供一些全局构造器(constructor),也即全局类。比如Date()、RegExp()、String()、Object()和Array()等。
浏览器环境下的window对象
在浏览器环境中运行的JavaScript程序,除JS全局对象外,还存在另一个全局对象:window。该对象提供了大量与当前窗口及页面交互的属性和方法。值得注意的是,window对象封装了JS全局对象,并向外暴露其属性与接口。因此,在进行浏览器端JavaScript开发时,开发者通常只需关注window全局对象即可处理相关全局资源。
this关键字的指向规则
关于JavaScript中this关键字的指向规则:若this未绑定于任何函数内部,则它指代JS全局对象;而在浏览器环境中运行的代码里,此时this具体指代window全局对象。
当this归属于某个函数时,它通常指代调用该函数的对象。若该函数仅为普通函数而非类方法,则this的指向存在两种不同情况。
第一种情况依据ECMAScript 3标准及ECMAScript 5标准的非严格模式,此时this指代全局对象。第二种情况依据ECMAScript 5标准的严格模式,此时this的值为undefined。
严格模式检测实验
利用上述特性,可以通过特定代码片段来检测当前代码是否处于严格模式运行状态。
具体实现代码如下:
var strict = (function(){return !this;}());
若在JavaScript程序中声明了全局变量,该变量将自动成为全局对象的一个属性。
以下实验用于验证上述行为。
相关测试代码如下:
var a = this;
console.log(a);//输出window object
console.log(a.outerWidth);//访问window对象的属性
console.log(a.isNaN);//访问JS全局对象的属性
x = "test";
console.log(a.x);//访问新创建的全局变量值