JS之全局变量global

全局变量

  • 浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window
  • 浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self
  • Node 里面,顶层对象是global,但其他环境都不支持。

同一段代码为了能够在各种环境,都能取到顶层对象,现在一般是使用this变量,但是有局限性。

  • 全局环境中,this会返回顶层对象。但是,Node 模块和 ES6 模块中,this返回的是当前模块。
  • 函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。但是,严格模式下,这时this会返回undefined
  • 不管是严格模式,还是普通模式,new Function(‘return this‘)(),总是会返回全局对象。但是,如果浏览器用了CSP(Content Security Policy,内容安全政策),那么evalnew Function这些方法都可能无法使用。

综上所述,很难找到一种方法,可以在所有情况下,都取到顶层对象。下面是两种勉强可以使用的方法。

// 方法一

(typeof window !== ‘undefined‘

   ? window

   : (typeof process === ‘object‘ &&

      typeof require === ‘function‘ &&

      typeof global === ‘object‘)

     ? global

     this);

// 方法二

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‘);

};

现在有一个提案,在语言标准的层面,引入global作为顶层对象。也就是说,在所有环境下,global都是存在的,都可以从它拿到顶层对象。

垫片库system.global模拟了这个提案,可以在所有环境拿到global

// CommonJS 的写法

require(‘system.global/shim‘)();

// ES6 模块的写法

import shim from ‘system.global/shim‘; shim();

上面代码可以保证各种环境里面,global对象都是存在的。

// CommonJS 的写法

var global = require(‘system.global‘)();

// ES6 模块的写法

import getGlobal from ‘system.global‘;

const global = getGlobal();

上面代码将顶层对象放入变量global

原文地址:https://www.cnblogs.com/U5B89/p/9582384.html

时间: 2024-10-01 21:09:15

JS之全局变量global的相关文章

(译)Node.js的全局变量

原文标题:Global Variables in Node.js原文链接:http://www.hacksparrow.com/global-variables-in-node-js.html 你可能正在使用一些 Node.js 的模块,或者一个框架比如 Express.js ,并且突然感觉你需要创建一些全局变量.在 Node.js 中你会如何创建全局变量? 在这个问题上,大多数的建议是"不使用 var 声明变量",或者是"把变量添加到 global 对象上",亦或

js设置全局变量ajax中赋值

js设置全局变量,在ajax中给予赋值赋值不上问题解决方案 方案一. //在全局或某个需要的函数内设置Ajax异步为false,也就是同步. $.ajaxSetup({async : false}); //然后再进行你的Ajax操作 $.post(地址, 参数, function(data, status) { if (status == "success") { //赋值给全局变量 } }); 方案二. $.ajax({type : "post",url :地址,

JS的全局变量&局部变量

1 <script> 2 var i=10; //全局变量 3 j = 20; //全局变量 4 5 function(){ 6 var i=30; //局部变量 7 h = 40; //全局变量 8 } 9 </script> 由此可以总结一句话,在函数内部定义的就是局部变量,否则就是全局变量. 1 <script> 2 var i =10; 3 function display(){ 4 //var i = 20;//局部变量只在局部作用域起作用 5 i= 30;

【node.js】全局变量、常用工具、文件系统

学习链接:http://www.runoob.com/nodejs/nodejs-global-object.html 在 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性. 全局对象与全局变量 注意: 永远使用 var 定义变量以避免引入全局变量,因为全局变量会污染 命名空间,提高代码的耦合风险. __filename __dirname setTimeout

python 局部变量和全局变量 global

当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始. 使用局部变量 例7.3 使用局部变量 #!/usr/bin/Python# Filename: func_local.py def func(x):    print 'x is', x    x = 2    print 'Changed local x to', x x = 50func(

关于js中全局变量和局部变量的寄到小题

往往最基本的也是最根本的. 这里有三道关于全局变量和局部变量的小题,供诸位一阅. 知识点: (1)在最外层声明的是全局变量 (2)在函数内声明的是局部变量 (3)在函数体内部,但是没有用var声明的变量也是全局变量 第一题: var a = 10;function fun(){var a = "global";}console.log(a); 第二题: var a ;function fun(){a = "global";} fun();console.log(a)

PHP 的 全局变量 global 和 超全局变量 $GLOBAL - 只需一篇你就明白

文章涉及到了 PHP 的 & 引用 ,转载自 http://blog.csdn.net/yanhui_wei/article/details/8246083 +++ 探讨(一)+++++++++++++++++++++++++++++++++++++++ 很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然. 根据官方的解释是 $GLOBALS['var'] 是外部的全局变量$var本身. global $var 是外部$var的同名引用或者指针.(错误:是个别名引用而已,

js中全局变量的一点小知识点

js中有三种方式定义全局变量: 在任何函数外面直接执行var语句,例如:var f="value"; 直接添加一个属性到全局变量上,在web浏览器中,全局对象名为window.例如:window.f="value"; 直接使用未经过声明的变量,以这种方式定义的全局变量成为隐式的全局变量.例如:f="value"; 尽可能少使用全局变量: 其中一种方法就是将他们添加到同一个命名空间去:例如: 1 var My={}; 2 My.name={ 3 &

Javascript:谈谈JS的全局变量跟局部变量

原文链接:http://blog.csdn.net/zyz511919766/article/details/7276089# 今天公司一个实习小妹子问我两段JS代码的区别: [javascript] view plain copy <script type="text/javascript"> var a = "Hello"; function test(){ var a; alert(a); a = "World"; alert(