2010-02-10 66 views
12

之前,如果一个变量被定义或没有我检查,如果没有明确的定义,我会做来定义它:“变量”用它被定义

if (typeof(aVariable) == 'undefined') { 
    var aVariable = value; 
} 

因为变量未定义JSLint警告说,它在被定义之前使用,这正是我想要的。

我该如何克服这个问题?

我想启用定义这些变量明确地这样做:

<script> 
    var aVariable = value; 
</script> 
<script src="myScript.js"></script> 

所以大家谁是要包括该脚本可以自定义的一些属性。我担心我无法改变这种逻辑,因为它已经以这种方式在数百个网站中使用。

向下滚动以获取答案/解决方案,因为我已经回答了我自己的问题堆栈溢出没有显示出来。一定不要错过它们。

回答

5

我在JSLint邮件列表中找到了更多可接受的答案,对于Boldewyn,抱歉:)

解决方案1 ​​

在IE中,在脚本级别(即,每个文件或每个脚本块),如果在解析阶段(执行前)发现 “var”声明,它将重置该变量的 值(如果它已经存在)。

所以更好的方式是简单地做到这一点:

/*global foo: true */ 
if (typeof foo === "undefined") { 
foo = "some value"; 
} 

如果不宣布“无功”,简单地分配FOO,foo将自动获得 全局范围。

解决方案2(特殊情况)

如果明确设置变量不是零或假

var foo = foo || "some value"; 
+0

解决方案2是否存在性能损失?或有任何副作用?我想我将无法改变全球foo? – Vanuan 2012-05-15 13:48:26

+0

解决方案2似乎有一个副作用:页面在Safari上加载后(在iOS 6.1.3上)很快崩溃,当JS文件具有行'var window = window || {};'。 Chromium(在Ubuntu 12.04上)没有这样的问题。奇怪。 – 2013-09-12 23:48:19

7

我认为JSLint告诉你的是,在定义之前不应该使用变量。如果您很高兴在您的情况下适用 - 您可以忽略该警告。如果你不是很确定,再想一想为什么这个变量还没有定义。

例如,你真的想测试aVariable是否有值集,而不是或者没有定义?

var aVariable = null; 

...(晚些时候)

if (aVariable == null) { 
    aVariable = value; 
} 
2

试试这个:

aVariable = null; 

aVariable = typeof(aVariable) == 'undefined' ? null : value; 
-1

这错误似乎当您使用骆驼外壳为您的变量名被触发。如果以大写字母(变量)开始变量或将其全部设为小写字母(变量),则只会得到“隐含的全局”错误。

我不确定通过在你的变量名上强制使用套接字是什么意思,尽管你总是需要用JSLint来处理一些盐。你在这里做的是完全有效的,并且是避免意外使用未定义变量的良好习惯。

+0

问题:* JSLint的警告被定义之前,它是用来*。这与骆驼案有什么关系?它不*完全有效,因为JSLint是正确的:在定义之前,变量*被使用。 – Boldewyn 2010-02-10 08:00:09

+1

在投票前仔细阅读我的答案。它与OP使用的变量名称的外壳相关:'aVariable'。在变量名称为'avariable','AVARIABLE'或'Avariable'中运行相同的代码,您会注意到JSLint不再显示错误。 – 2010-02-10 08:29:24

+0

那么,您使用哪种JSLint? http://www.jslint.com/上的结果与拼写无关,因为它与拼写*无关。 – Boldewyn 2010-02-10 08:45:37

4

你可以把这些变量(这是全球反正)的window明确的成员:

window.aVariable = 'default'; 

后来

if (! ('aVariable' in window)) { 
    window.aVariable = 'new value'; 
} 

如果你不想或不能改变的代码,然后我'd建议务实的ansatz并忽略JSLint的抱怨,因为你的代码无论如何都会工作(也就是说,只要你不启用ECMAScript 5的严格模式......)。

1

最容易声明变量所做的任何使用它们之前:

var aVariable; 

这将类型为“不确定”被初始化,所以不确定的测试仍然可以工作:

if (typeof aVariable == "undefined") { 
    aVariable = value; 
}