gpt4 book ai didi

javascript - 仅当 ES5 strict 中不存在时,如何定义全局变量?

转载 作者:数据小太阳 更新时间:2023-10-29 06:07:35 24 4
gpt4 key购买 nike

我正在 ES5 中编写 ES Harmony Symbol/Name 的实现。我将使用名称 Symbol,但我希望浏览器使用它已经存在的任何预先存在的 Symbol(在未来的浏览器中) .我希望我的代码严格兼容 ES5 并可移植到其他项目。

这是在 ES3/ES5 非严格中做我想做的事情的一种(很多)方法:

(function() {

// If Symbol already exists, we're done.
if(typeof Symbol != 'undefined') return;

// This becomes global because it wasn't declared with var
Symbol = function() {
// ...
};

})();

但是,它并不严格符合 ES5,因为 Symbol 没有明确定义。

实现此目的的其他方法包括访问 window 对象 (window.Symbol = ...),但这也不好,因为我不想我的代码假设它在浏览器环境中运行。

如何在 ES5 strict 中做到这一点?

最佳答案

其他用户发布的答案让我想到了一个类似的 StackOverflow 问题,它为我提供了在 Google 中搜索以找到答案的正确条件。解决方案:

我最终能够通过使用 indirect eval 来解决这个问题。 , 描述 here .

根据 ES5 规范,使用间接求值(在上面链接的文章中有详细介绍)在全局范围内执行代码。我选择采用这种方法,因为它符合 ES5 规范,并且允许代码真正地被丢弃到任何地方,甚至在包管理器的另一个函数中,并且仍然可以找到全局对象(它提供的其他答案做不到)。

解决方案是这样的:

(function() {

'use strict';

var _global = (0, eval)('this');

// If Symbol is already defined, there's nothing to do.
if(_global.Symbol) return;

_global.Symbol = function() {
// ...
};

})();

关键是使用间接 eval 检索全局对象(this 在间接 eval 的上下文中)。

这应该适用于任何符合 ES5 标准的东西,包括现代浏览器和非浏览器环境,正如我所希望的那样。

感谢大家的帮助!

唯一需要注意的是,为了访问全局对象而必须以这种间接方式(现在更糟)使用 eval(这已经够糟糕了)似乎有点老套。 global 标识符或其他访问全局对象的方法是否应该不在规范中?

关于javascript - 仅当 ES5 strict 中不存在时,如何定义全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com