在JavaScript中;“严格模式”;如何仅在变量不';不存在于全球范围内?

在JavaScript中;“严格模式”;如何仅在变量不';不存在于全球范围内?,javascript,Javascript,我在代码中使用名为DEBUG的变量有条件地收集调试信息: if (DEBUG) console.log('...'); 这个变量可能已经在其他地方设置过了,例如,当我想为生产构建时,我静态地将其设置为false(这在优化代码后有效地删除了整行代码)。但是,如果未定义,为了避免未定义的变量错误,我将其设置为默认值: if (typeof DEBUG === 'undefined') DEBUG = false; 问题是它在严格模式下不工作,因为不允许使用全局变量DEBUG。如果我将其更改为:

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

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

if (typeof DEBUG === 'undefined') DEBUG = false;
问题是它在
严格模式下不工作,因为不允许使用全局变量
DEBUG
。如果我将其更改为:

if (typeof DEBUG === 'undefined') var DEBUG = false;
然后,由于JavaScript中的提升,它就如预期的那样

所以我的问题是在“严格模式”中,如果变量在全局模式中不存在,我应该如何定义它


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

if (typeof DEBUG === 'undefined') var DEBUG = false;
会很好用的

您考虑起重是正确的,但这不会给您带来问题,因为这在解释器看来实际上是这样的:

var DEBUG;
if (typeof DEBUG === 'undefined') DEBUG = false;
但是,
var DEBUG
DEBUG
已在此范围中定义时,它不会执行任何操作。它不会影响在此范围内以前定义的同名变量,不会导致错误,也不会更改
DEBUG
变量的值。它所做的就是定义它(如果它还没有在这个范围内定义)

注意:
const
let
不允许您“重新声明”同一范围内的现有变量(它们会导致错误)。只能使用
var
执行此操作


您的评论似乎表明您正试图影响node.js中的一个全局变量(尽管您的问题没有提到这一点)。node.js中的全局变量通过
global
对象引用。所以,也许你想要的是:

if (typeof global.DEBUG === 'undefined') global.DEBUG = false;
在node.js的严格模式下,无法定义不使用
global
前缀的全局变量。这是因为在严格模式下,定义不带前缀的全局变量的唯一方法是在实际全局范围内使用
var
let
const
,但在node.js中,所有内容都在模块范围内,因此不能将其中一个声明放入全局范围。因此,在node.js中,创建全局变量必须使用
global
前缀,如下所示:

global.DEBUG = false;
但是,您可以在不使用前缀的情况下测试已知已定义的全局变量,只要您确定在较近的范围内没有定义同名的中间变量(因为如果有,您将测试该较近定义的变量,而不是全局变量)

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

你不能做的是:

if (DEBUG) console.log("in debug mode");
当调试未在任何地方定义时。这将导致Javascript错误。因此,只要确保定义了DEBUG,就可以不使用前缀引用它



如果您正在寻找一种browser/node.js引用全局对象的方法,该方法将在这两种方法中使用,请参见:

@AliShakiba-您将语句放入函数中。第二个
var
在该函数范围内声明了一个新的不同变量。您必须在与您测试的变量相同的范围内执行此操作。而且,您的问题并没有显示任何关于这种情况的信息。对,我使用的是node,所以每个文件都有自己的作用域。@AliShakiba-我们现在讨论的内容根本不在您的问题中。您的问题似乎是询问同一范围内的变量。如果您询问node.js中的全局变量,则必须使用
global.DEBUG
专门引用它,以确保在node.js模块中测试和初始化全局变量<代码>如果(typeof global.DEBUG=='undefined')global.DEBUG=false
@AliShakiba-我在node.js.Setting
global.DEBUG
中添加了一些关于全局变量的信息,但是要让优化器静态计算变量
typeof global.DEBUG=='undefined'
需要是
typeof DEBUG=='undefined'
。您是否尝试将其定义为节点全局变量?例如
global.DEBUG
?使用
global
引用全局变量:
if(typeof global.DEBUG=='undefined')global.DEBUG=false。其他代码仍然可以通过
DEBUG
引用。我需要支持所有JS框架,并且我希望能够使用代码优化器删除调试代码,因此。DEBUG不起作用。@AliShakiba-我放弃这个问题。每次我们为您提供解决方案时,您都会添加更多的需求。不值得我们在这里追尾。下次发布问题时,请提前说明所有要求。如果不指定
global.DEBUG
,则无法在严格模式下从node.js模块定义全局符号
DEBUG
。严格模式显式阻止意外或非显式全局变量的创建。@jfriend00很抱歉进行更新,但我没有添加要求,这只是js包的常见情况,应该在browser和node.js中工作。
if (DEBUG) console.log("in debug mode");