2012-07-21 55 views
45

的JSLint不流通这是一个有效的代码:什么是检查全局变量是否存在的正确方法?

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

什么是正确的方法是什么?

+0

注意'var'没有作用范围是'if'块这种检查将失败。就好像你在'if'之上写了'var someVar'。参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting – leewz 2016-10-11 05:41:50

回答

62
/*global window */ 

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

if (!window.hasOwnProperty('someVar')) { 
    window.someVar = 123456; 
} 
+5

而不是'/ *全局窗口* /',你可以使用'/ * jslint browser:true * /'。 – XP1 2012-07-24 23:58:36

+11

为了得到相同的结果,第二种解决方案实际上应该是'if(!window.hasOwnProperty('someVar'))' – Pioul 2012-10-11 09:48:14

+2

如果页面在你之前运行这个脚本,那么该怎么办:'undefined ='some value''? – 2012-11-27 13:11:07

13
/** 
* @param {string} nameOfVariable 
*/ 
function globalExists(nameOfVariable) { 
    return nameOfVariable in window 
} 

不要紧,你是否创建了VAR FOO或window.foo一个全局变量 - 在全球范围内VAR创建的变量被写入窗口。

+3

当然,你不必使用一个函数,你可以简单地使用'“foo “在任何地方的窗口” – gvlasov 2012-07-21 22:33:36

+3

Hrmmm,JSlint说:'意外'in'。与undefined比较,或者使用hasOwnProperty方法。“然后,我想,正确的方法是: 'window.hasOwnProperty(”nameOfVar“)' – gvlasov 2012-07-22 03:39:27

+1

@Susei:jsLint不正确。 '.hasOwnProperty()'有问题,因为全局可能在'window'的原型链下面。它仍然是一个全局变量,但是.hasOwnProperty()不会看到它。 'in'或'undefined'测试是实现它的方法。 – 2013-07-14 14:22:02

4
if (typeof someVar === "undefined") { 
    var someVar = "hi!"; 
} 

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

如果你想检查一个全局变量,你可以使用

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

假设这是在浏览器:)

7

尝试

variableName in window 

typeof window[variableName] != 'undefined' 

window[variableName] !== undefined 

window.hasOwnProperty(variableName) 
+2

你试过在JSLint上测试这些吗? “'someVar'in window”,“typeof window ['someVar']!=='undefined'”,“window ['someVar']!== undefined”(不转换为“window.someVar!== undefined)在JSLint中不是好的,但无论如何,谢谢你的回答:) – 2012-07-22 03:46:58

+1

''object''中的'prop'是绝对合法的JavaScript记住,JSLint适合你,而不是JSLint,而JSLint不是JavaScript。 'if('obj'){do_it();}'更清晰(即可读和可维护),然后'if(obj.prop!== undefined){do_it();}'我建议你在这种情况下忽略JSLint。另请参阅http://stackoverflow.com/questions/6824895/jslint-error-unexpected-in-compare-with-undefined-or-use-the-hasownproperty。 – kstep 2012-11-27 11:44:54

+0

你是绝对正确的,但我而是为了保持我的代码JSLint的有效性,因为它更容易维护。 – 2013-05-23 12:51:54

8

我觉得这其实是JSLint的一个问题。它会发出以下错误:

Unexpected 'typeof'. Compare directly with 'undefined'.

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

我更喜欢typeof someVar === "undefined",因为您发布了,或者someVar in window Susei建议。

+1

因为并非所有的JS都会在浏览器中运行,所以今天特别重要。如果你正在编写一个库,你希望你的代码同时工作获得浏览器以及像nodejs那样的窗口不存在的运行时。 – 2016-09-29 13:46:10

12

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

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

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

这是最优雅和最干净的解决方案。 – Christian 2016-12-07 01:05:59

2

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". 
+4

您不应该使用Answers部分来反驳另一个人的答案。如果你不认为别人的回答是有效的,那么就你所预见的问题回答他们的回答,以便他们能够解决问题,或者提供你自己的有效解决方案。 – Scott 2012-09-24 13:03:16

+1

这是相关的,但它不回答问题。我意识到这是太长时间才能发表评论,也许你也可以在你的分歧之下回答这个问题? – 2012-09-24 13:50:16

+1

为了让我知道你的不同意见,你可以留下对我的回答的评论,我只是偶然看到你的回答。你对我们的“最喜欢的浏览器”是正确的,问题在于旧版浏览器并没有阻止这种情况。我会编辑我的答案以使其更清楚。 – bfavaretto 2012-10-01 02:58:55

1

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

但如果variableName声明并分配与boolean value: false

if(window.variableName){ 

} 
相关问题