Javascript 检查全局变量是否存在的正确方法是什么?
JSLint未将此作为有效代码传递: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
/* 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'