在一个函数中如何区别Node环境和浏览器环境并执行对应代码段?

由于Node和浏览器环境的不同,内置的许多对象和函数都不一样,同一功能的实现可能需要编写不同的代码片段,那么问题来了,怎么区分Node环境和浏览器环境,我之前想当然以为下面这样写是可以的,然后结果是报错了

// 如何区分Node环境和浏览器环境
function distinguish() {
  if (global) {
    console.log('node环境')
  } else if (window) {
    console.log('window环境')
  } else {
    console.log('其他环境')
  }
}

distinguish()

以下是浏览器执行结果:
image.png
我知道是由于global未定义导致,有什么办法能够让if里面判断为false而不是报错呢?

阅读 2.7k
2 个回答

javascript 现在可以用标准的 globalThis 来获取全局对象,不需要区分环境了
https://developer.mozilla.org...

即使是在低版本浏览器,MDN 也提供了标准的 polyfill

var getGlobal = function () {
  if (typeof self !== 'undefined') { return self; }
  if (typeof window !== 'undefined') { return window; }
  if (typeof global !== 'undefined') { return global; }
  throw new Error('unable to locate global object');
};

个人认为这个条件判断可以比较完善地判断出这两个环境

function distinguish() {
  if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
    console.log('node环境')
  } else if (typeof window !== 'undefined' && Object.prototype.toString.call(window) === '[object Window]') {
    console.log('window环境')
  } else {
    console.log('其他环境')
  }
}
distinguish()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏