检查全局variables是否存在的正确方法是什么?

JSLint没有通过这个有效的代码:

/* global someVar: false */ if (typeof someVar === "undefined") { var someVar = "hi!"; } 

什么是正确的方法?

 /*global window */ if (window.someVar === undefined) { window.someVar = 123456; } if (!window.hasOwnProperty('someVar')) { window.someVar = 123456; } 
 /** * @param {string} nameOfVariable */ function globalExists(nameOfVariable) { return nameOfVariable in window } 

用var foo或window.foo创build一个全局variables并不重要 – 在全局上下文中用var创build的variables被写入窗口。

如果你只想分配一个全局variables,如果它尚不存在,请尝试:

 window.someVar = window.someVar || 'hi'; 

要么

 window['someVar'] = window['someVar'] || 'hi'; 

我认为这实际上是JSLint的一个问题。 它会发出以下错误:

意想不到的'typeof'。 直接与'undefined'比较。

我相信这是不好的build议。 在JavaScript中, undefined是一个全局variables,通常是未定义的。 但是一些浏览器允许脚本修改它,如下所示: window.undefined = 'defined' 。 如果是这种情况,直接比较undefined可能会导致意想不到的结果。 幸运的是,目前ECMA 5兼容的浏览器不允许赋值undefined (并将在严格模式下抛出exception)。

我比较喜欢typeof someVar === "undefined" ,或者像Suseibuild议的someVar in window一些variables。

尝试

 variableName in window 

要么

 typeof window[variableName] != 'undefined' 

要么

 window[variableName] !== undefined 

要么

 window.hasOwnProperty(variableName) 
 if (typeof someVar === "undefined") { var someVar = "hi!"; } 

将检查someVar (本地或全局)是否未定义。

如果你想检查你可以使用的全局variables

 if(window['someVar'] === undefined) { ... } 

假设这是在浏览器中:)

bfavaretto是不正确的。

将全局undefined设置为值不会改变对未定义的对象的testing。 在您最喜欢的浏览器JavaScript控制台中试试这个:

 var udef; var idef = 42; alert(udef === undefined); // Alerts "true". alert(idef === undefined); // Alerts "false". window.undefined = 'defined'; alert(udef === undefined); // Alerts "true". alert(idef === undefined); // Alerts "false". 

这仅仅是因为JavaScript忽略了所有和任何试图在未定义variables上设置的值。

 window.undefined = 'defined'; alert(window.undefined); // Alerts "undefined". 

这将是一个简单的方法来执行检查。

但是,如果声明了variableName ,并且分配了boolean value: false ,则此检查将失败

 if(window.variableName){ }