Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript全局环境检测

  JavaScript的全局执行环境有很多种,比如document环境、worker环境、NodeJS环境、WSH环境,等。在做一些通用封装时,代码可能被执行在任意全局环境中,而这些环境中使用的API不同,程序就必须检测自己所在的全局环境,并对一些特定功能做特殊实现。
  要检测环境,首先要取到全局对象。全局对象的引用方式在不同的环境中存在差异,比如document环境中全局引用是window、worker环境中的全局引用是self、NodeJS环境中的全局引用是global。所以必须要有一种获取全局对象的通用方法,这里我提供一种使用Function来获取的方法。
var global=Function("return this")();   不直接使用function是因为考虑到严格模式下this的指向问题,这里使用Function来退出严格模式,然后再取this
  有了全局对象之后,我们就可以根据全局对象的构造器名来检测其环境了。document环境的全局对象构造器名从IE8+开始都是"Window"、worker环境的全局对象构造器名为"DedicatedWorkerGlobalScope"、NodeJS环境的全局对象构造器直接是Object对象,所以名为"Object"。通过这些,我们就已经可以区分IE8+的document环境、worker环境以及NodeJS环境了。
  低版本IE上,访问全局对象的constructor属性会得到undefined,如果对其做特殊判断的话就可以区分出低版本IE。最后还有个更蛋疼的WSH环境,在WSH环境中访问全局对象的constructor属性会抛出异常,同样我们对其做特殊判断的话也可以将其区分开来。于是综合上述条件可以得到:
var global=Function("return this")();
var environment=function(){
  var e=(global.constructor+"").match(/ (\w+)|$/)[1];
  if(!e)try{
    if(global=="[object]")e="Window"; //IE7-
  }catch(x){ e="WSH"; };
  return e;
}();
switch(environment){
  case "Window":
    alert("当前为document环境");
    break;
  case "DedicatedWorkerGlobalScope":
    console.log("当前为Worker环境");
    break;
  case "WSH":
    WSH.echo("当前为WSH环境");
    break;
  case "Object":
    console.log("当前为NodeJS环境");
    break;
  default:
    //其它未知环境
};
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^