[翻译]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 ...
随机推荐
- JavaScript触屏滑动API介绍
随着触屏手机.平板电脑的普及和占有更多用户和使用时间,触屏的触碰.滑动等事件也成为javaScript开发不可避免的知识,现在何问起就和大家一起学习js的触屏操作,js的触屏touchmove事件,为 ...
- shell笔记
shell:俗称操作系统的"外壳",就是命令解释程序. 是用户与Linux内核之间的接口. 是负责与用户交互,分析.执行用户输入的命令,并给出结果或出错提示. ...
- 建造者模式组装mybatis参数Example()
参考:github, https://github.com/liuxiaochen0625/MyBatis-Spring-Boot-master.git 从controller组装tk.mybat ...
- Canvas设置width与height 的问题!
最近因为工作需要,所以就学了一下Html中的Canvas标签. 当我看了一下教程后,自己写了一个hello world的时候,麻烦事就出现了.看下面代码: <!DOCTYPE html> ...
- 【HTML5&CSS3进阶04】CSS3动画应该如何在webapp中运用
动画在webapp的现状 webapp模式的网站追求的就是一个体验,是HTML5&CSS3浪潮下的产物,抛开体验不说,webapp模式门槛比较高: 而体验优化的一个重点便是动画,可以说动画是w ...
- switch语句的妙用
switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console. ...
- Kotlin开发语言文档(官方文档)-- 目录
开始阅读Kotlin官方文档.先上文档目录.有些内容还未阅读,有些目录标目翻译还需琢磨琢磨.后续再将具体内容的链接逐步加上. 文档链接:https://kotlinlang.org/docs/kotl ...
- TFFS格式化到创建成功过程
True FFS内核编程 1.格式化FLASH 即使FLASH没有和块设备驱动绑定,也可对其进行格式化. tffsDevFormat (int tffsDriveNo, int formatArg); ...
- Laravel大型项目系列教程(五)之文章和标签管理
一.前言 本节教程将大概完成文章和标签管理以及标签关联. 二.Let's go 1.文章管理 首先创建管理后台文章列表视图: $ php artisan generate:view admin.art ...
- C#语言基础——递归
递归 一.概念conception: 函数体内调用本函数自身,直到符合某一条件不再继续调用. 二.应满足条件factor: (1)有反复执行的过程(调用自身): (2)有跳出反复执行过程的条件(函数出 ...