在 JavaScript "strict mode"中,如何仅在全局范围内不存在变量时才定义变量?



我在代码中使用名为DEBUG的变量来有条件地收集调试信息:

if (DEBUG) console.log('...');

这个变量可能已经在其他地方设置了,例如,当我想要为生产构建时,我将其静态设置为 false(这在优化代码后有效地删除了整行代码)。 但是,当它没有定义时,为了避免未定义的变量错误,我将其设置为默认值:

if (typeof DEBUG === 'undefined') DEBUG = false;

问题是它在strict mode中不起作用,因为不允许使用全局变量DEBUG。如果我将其更改为:

if (typeof DEBUG === 'undefined') var DEBUG = false;

然后它不能按预期工作,因为 JavaScript 中的提升。

所以我的问题是在"严格模式"下,只有当变量在全局中不存在时,我才应该如何定义它?


编辑:windows.DEBUG没有帮助,因为它只能在浏览器中工作,而不是在节点中工作.js(我需要它们两个),而且它不允许我使用代码优化器来设置全局变量并删除调试行(请参阅:UglifyJS 文档中的global_defs)。

您的示例:

if (typeof DEBUG === 'undefined') var DEBUG = false;

会正常工作。

您考虑吊装是正确的,但这不会给您带来问题,因为口译员真正看起来像是这样的:

var DEBUG;
if (typeof DEBUG === 'undefined') DEBUG = false;

但是,var DEBUGDEBUG已在此范围内定义时,则不执行任何操作。 它不会影响此作用域中具有相同名称的先前定义的变量,不会导致错误,也不会更改DEBUG变量的值。 它所做的只是定义它(如果尚未在此范围内定义)。

注意:对于不允许在同一范围内"重新声明"现有变量的constlet,情况并非如此(它们会将其变成错误)。 您只能使用var

.

您的评论似乎表明您正在尝试影响node中的全局变量.js(即使您的问题对此没有任何说明)。 node.js 中的全局变量通过global对象引用。 所以,也许你想要的是这个:

if (typeof global.DEBUG === 'undefined') global.DEBUG = false;

在 node.js 的严格模式下,无法定义不使用global前缀的全局变量。 这是因为在严格模式下,定义不带前缀的全局变量的唯一方法是在实际的全局范围内使用varletconst,但在 node 中.js一切都在模块范围内,因此您不能将这些声明之一放入全局范围。 因此,在 node.js 中,创建全局变量必须使用global前缀,如下所示:

global.DEBUG = false;

但是,只要您确定在更近的范围内没有定义同名的干预变量,您就可以测试已知已定义的全局变量而无需使用前缀(因为如果有,您将测试该更紧密定义的变量,而不是全局变量)。

if (DEBUG) console.log("in debug mode");

只要在此代码可见的某个范围内已经定义了DEBUG,这将起作用。

你不能做的是:

if (DEBUG) console.log("in debug mode");

当调试未在任何地方定义时。 这将导致Javascript错误。 因此,只要您确保定义了 DEBUG,就可以在没有前缀的情况下引用它。


如果您正在寻找一种浏览器/节点.js引用全局对象的方式,请参阅以下内容:https://gist.github.com/rauschma/7960405

最新更新