[翻译]ES 提案: global
Jordan Harband 的 ECMAScript 提案“global
”现在处于第三阶段。该提案提供了一种新的用于访问全局对象的标准方式。
全局对象的引用
下面是常用的几种引用全局对象的方式:
- 全局变量:
- 全局变量
window
: 这是经典的全局对象。但是在 Node.js 和 Web Worker 里不可用。 - 全局变量
self
: 在 Web Worker 和一般浏览器中可用。但是 Node.js 不支持。有一些人使用self
来使得代码能在 Web Workers 和一般浏览器的环境中都能生效。 - 全局变量
global
: 至今仅仅只有 Node.js 使用!
- 全局变量
this
:全局作用域里的 this
: 指向全局对象。唯一的问题是 Node.js 模块和 ES6 模块有它们自己的作用域,而这意味着这里的 this 不会指向全局对象。非严格模式下函数调用里的 this
: 如果你在非严格模式下调用一个函数(不是方法调用),函数的this
会指向全局对象。在严格模式下,this 是undefined。
new Function('return this')()
: 在严格模式和非严格模式下同样有效,因为new Function()
的参数总是在非严格模式下执行。下面是一个严重的警告:当你使用CSP (Content Security Policy)的时候,eval
,new Function() 等等是不可用的。这使得这种返回 this 的方法在许多情况下不适宜使用。
提案
该 ECMAScript 提案提议:将全局变量 global
作为访问全局对象的标准方式。该提案也提议: Object.prototype
必须在全局对象的原型链里。下面的代码在现在的浏览器上是 true:
> Object.prototype.isPrototypeOf(window)
true
最佳实践
现在,由于向后兼容的缘故,全局对象被认为是一个 JavaScript 不能摆脱错误。它影响性能,且通常是令人困惑的。
ECMAScript 6 提供了下面不会在全局作用域里创建全局属性(var 声明和函数声明会)
的三种新的声明变量的方式来避免:
let
声明const
声明Class
声明
换句话说:全局对象的所有属性是全局变量,但不是所有的全局变量都是全局对象的属性。比如(在全局作用域执行):
> var foo;
> 'foo' in window
true > let bar;
> 'bar' in window
false
通常情况下将全局变量只作为变量好于将其作为全局对象的属性,比如 window。这样就能在所有
JavaScript 平台上都有效。
另外,从 ES6 开始(甚至在这之前),多数 JavaScript 代码都存在模块里且永远都不会出现在全局作用域里。
因此,global
将大多时候与 polyfills 相关(global
will mostly be relevant for polyfills)。
A polyfill
本提案的作者 Jordan Harband 为此写了一个polyfill。
CommonJS 语法:
var global = require('system.global')();
ES6 模块语法:
import getGlobal from 'system.global';
const global = getGlobal();
这个包使用的是“最原生的”可用的访问方法(比如 Node.js 的 global,一般浏览器环境的
window
等等)。
获得全局对象的引用
在代码内部,这个 polyfill 使用 getPolyfill() 函数来计算得全局对象的引用。以下是实现方式:
// polyfill.js
var implementation = require('./implementation');
module.exports = function getPolyfill() {
if (typeof global !== 'object' || !global || global.Math !== Math
|| global.Array !== Array) {
return implementation;
}
return global;
}; // implementation.js
if (typeof self !== 'undefined') {
module.exports = self;
} else if (typeof window !== 'undefined') {
module.exports = window;
} else if (typeof global !== 'undefined') {
module.exports = global;
} else {
module.exports = Function('return this')();
}
关于全局对象的更多信息
原文:ES proposal: global
[翻译]ES 提案: global的更多相关文章
- vue项目实现按需加载的3种方式:vue异步组件技术、es提案的import()、webpack提供的require.ensure()
1. vue异步组件技术 vue-router配置路由,使用vue的异步组件技术,可以实现按需加载. 但是,这种情况下一个组件生成一个js文件. 举例如下: { path: '/promisedemo ...
- route按需加载的3种方式:vue异步组件、es提案的import()、webpack的require.ensure()
1. vue异步组件技术 vue-router配置路由,使用vue的异步组件技术,可以实现按需加载. 但是,这种情况下一个组件生成一个js文件.举例如下: { path: '/promisedemo' ...
- ES 提案的各状态
JavaScrpit,亦即 ECMAScript,新功能的演进是由一个叫 TC39 这么个组织在统筹协调和推进的. 一般新特性会由社区先提案,被采纳后开始进入下一流程.一个提案到最终落地到成为标准,需 ...
- ES新提案:双问号操作符
摘要: 简单实用的新特性. 原文:ES新提案:双问号操作符 译者:前端小智 本文主要讲Gabriel Isenberg撰写的ES提案"Nullish coalescing for JavaS ...
- es6新增特性总结
定义 ES6是ECMA为JavaScript制定的第6个标准版本,标准委员会决定,标准在每年6月正式发布并作为当年的正式版本,接下来的时间里就在此版本的基础上进行改动,直到下一年6月草案就自然变成新一 ...
- 网络中的NAT模式
一.概述 NAT英文全称是"Network Address Translation",中文意思是"网络地址转换",它是一个IETF(Internet Engin ...
- JavaScript 的正则也有单行模式了
正则表达式最早是由 Ken Thompson 于 1970 年在他改进过的 QED 编辑器里实现的,正则里最简单的元字符 “.” 在当时所匹配的就是除换行符外的任意字符: "." ...
- python中的PEP是什么?怎么理解?(转)
PEP是什么? PEP的全称是Python Enhancement Proposals,其中Enhancement是增强改进的意思,Proposals则可译为提案或建议书,所以合起来,比较常见的翻译是 ...
- vue 动态路由按需加载的三种方式
在Vue项目中,一般使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hell ...
随机推荐
- Yii2.X 多语言-类图
- 【Java每日一题】20161223
package Dec2016; public class Ques1223 { public static void main(String[] args){ Integer obj = Integ ...
- python generator next send
*******oi********oi********oi 上面 * 符号 代表 一系列的代码, oi 代表 一个 [yield]关键字引出的 [数据交换,称之为 oi ] 在一个有[yield] ...
- Workflow笔记2——状态机工作流
状态机工作流 在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它比流程图功能更加强大. 状态机工作流:就是将工作流系统中的所有的工作节点都可以看做成 ...
- BroadcastReceiver几种常见监听
1.BroadcastReceiver监听拨号 <intent-filter android:priority="1000" > <action android: ...
- mysql can't create threads in threadpool
最近,我们在券商端的mysql运行一段时间后,发生mysql can't create threads in threadpool,如下所示: 据官网一个报告显示,目测是一个bug,内存紧张导致,那天 ...
- Qt——组件位置随窗口变化
当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...
- iOS角度与弧度转换
在iOS中图片的旋转单位为弧度而不是角度,所以经常会在两者之间进行转换 弧度转角度 #define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / ...
- 一些Titanium学习的地方
利用titanium兑现外汇兑换计算的ios代码 http://rensanning.iteye.com/blog/1325011 Titanium兑现相关的报表功能 http://www.s ...
- Android LocalBroadcastManager 的使用总结
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6048369.html 本文出自[赵彦军的博客] 前言 在Android中,Broadcast是一种广泛运用的 ...