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

Javascript 检查全局变量是否存在的正确方法是什么?,javascript,global-variables,jslint,Javascript,Global Variables,Jslint,JSLint未将此作为有效代码传递: /* global someVar: false */ if (typeof someVar === "undefined") { var someVar = "hi!"; } 正确的方法是什么 /** * @param {string} nameOfVariable */ function globalExists(nameOfVariable) { return nameOfVariable in window } 不管您是使用v

JSLint未将此作为有效代码传递:

/* global someVar: false */
if (typeof someVar === "undefined") {
    var someVar = "hi!";
}
正确的方法是什么

/**
 * @param {string} nameOfVariable
 */
function globalExists(nameOfVariable) {
    return nameOfVariable in window
}
不管您是使用var foo还是window.foo创建全局变量,在全局上下文中使用var创建的变量都会写入窗口

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

如果要检查全局变量,可以使用

if(window['someVar'] === undefined) {
    ...
}
假设这是在浏览器中:)

试试看

variableName in window


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

意外的“类型”。直接与“未定义”进行比较

我认为这是个糟糕的建议。在JavaScript中,
undefined
是一个通常未定义的全局变量。但有些浏览器允许脚本修改它,如:
window.undefined='defined'
。如果是这种情况,直接与
未定义的
进行比较可能会导致意外的结果。幸运的是,当前兼容ECMA 5的浏览器不允许分配到未定义的
(并且将在严格模式下引发异常)


我更喜欢您发布的
typeof someVar===“undefined”
,或者Susei建议的
someVar in window

如果您只想在全局变量不存在的情况下分配它,请尝试:

/*global window */

if (window.someVar === undefined) {
    window.someVar = 123456;
}

if (!window.hasOwnProperty('someVar')) {
    window.someVar = 123456;
}
window.someVar = window.someVar || 'hi';


bfavaretto是不正确的

将“全局未定义”设置为一个值不会改变对未定义对象的测试。在您喜爱的浏览器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忽略了试图在未定义变量上设置的所有和任何值

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

这将是执行检查的简单方法

但如果声明了
variableName
并为其分配了
布尔值:false

if(window.variableName){

}

在ES6中,大多数其他答案,包括接受的答案,都是不正确的,因为由
let
const
定义的全局变量,或由
声明产生的全局变量,在全局对象上没有相应的属性(
浏览器中的
窗口
,或node.js中的
全局
)。其中一些变量(主要是使用
typeof
)也可能被存在但设置为
未定义的全局变量所愚弄

测试全局变量是否存在的唯一完全通用的方法,无论它是使用赋值创建的
函数创建的
var
let
还是
const
,都是如此(即,
myVar=value
在程序的顶层,没有对
myVar
进行任何声明)或通过在全局对象上创建属性(即,
window.myVar=value
)来尝试通过全局
eval
访问它,并查看是否抛出TypeError

(这会生成,但有一个技巧可以确保它即使封装在函数中也能正常工作。)


请注意,这使用了
eval
,因此所有常见的警告都适用:不应提供不受信任的值作为参数,如果必须使用不受信任的值,则应检查以确保
varName
是有效的JavaScript标识符。这样做超出了此问题的范围,但可以使用-just来完成请注意,正确的regexp取决于您使用的ECMAScript版本、代码是脚本还是(ES6)模块、是否在异步函数中等等。我认为最好的解决方案是:

if(window.hasOwnProperty('foo')) {
    console.log('Variable is not declared');
}
如果变量已声明但未赋值(var foo;),则以下解决方案将不起作用


当然,您不必使用函数,您只需在window中使用
“foo”
任何地方HRMMM,JSlint说:
意外的“in”。与未定义相比,或者使用hasOwnProperty方法。
那么,我想,正确的方法是:
window.hasOwnProperty(“nameOfVar”)
@Susei:jsLint不正确。
.hasOwnProperty()
有故障,因为在
窗口的原型链下可能有一个全局变量。它仍然是一个全局变量,但
.hasOwnProperty()
看不到它。在
未定义的
中的
测试就是这样做的。这在NodeJS终端中不起作用;
窗口
在那里未定义。对于React应用程序来说,这是一个很好的答案,如果你想在JSXDid中进行内联检查,你可以尝试在JSLint上测试它们?”“窗口中的someVar”,“窗口的typeof['someVar']!='undefined',“window['someVar']!==undefined”(不将其转换为“window.someVar!==undefined)在JSLint上是不合适的。但无论如何,感谢你的回答:)
“prop”在object
中绝对是合法的JavaScript。记住,JSLint是给你的,不是给JSLint的,JSLint不是JavaScript。对我来说
如果('prop'在obj中){do_it();}
更清晰(即可读和可维护),然后
如果(obj.prop!==未定义){do_it();}
。在这种情况下,我建议您忽略JSLint。另请参见。您完全正确,但我宁愿让我的代码JSLint保持有效,因为它更易于维护。您可以使用
/*JSLint browser:true*/
,而不是
/*global window*/
。要获得相同的结果,第二个解决方案实际上应该是
如果(!window.hasOwnProperty('someVar'))
如果页面在您之前运行此脚本,该怎么办:
未定义='some value'
?请注意"web worker中没有定义它本身。为了最大的兼容性,请先检查window是否存在。@Offrmo有什么想法吗?在这种情况下,
window
是一个全局变量,我们要检查它的存在性-这当然是我们首先要解决的问题。您不应该使用“答案”部分来显示如果你不认为另一个人
window['someVar'] = window['someVar'] || 'hi';
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".
window.undefined = 'defined';
alert(window.undefined); // Alerts "undefined".
if(window.variableName){

}
function globalExists(varName) {
  // Calling eval by another name causes evalled code to run in a
  // subscope of the global scope, rather than the local scope.
  const globalEval = eval;
  try {
    globalEval(varName);
    return true;
  } catch (e) {
    return false;
  }
}

undeclared = undefined;
const myConst = undefined;
let myLet;
var myVar;

globalExists('undeclared')    // => true
globalExists('myConst')       // => true
globalExists('myLet')         // => true
globalExists('myVar')         // => true
globalExists('nonexistent')   // => false
globalExists('globalExists')  // => true - can see itself.
globalExists('varName')       // => false - not fooled by own parameters.
globalExists('globalEval')    // => false - not fooled by local variable.
if(window.hasOwnProperty('foo')) {
    console.log('Variable is not declared');
}
typeof foo === 'undefined'