12

我正在检查是否定义了变量,如果没有明确定义,我将通过以下方式定义它:

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

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

我该如何克服呢?

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

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

因此,将包含此脚本的每个人都可以自定义一些属性。恐怕我无法改变这个逻辑,因为它已经被数百个网站以这种方式使用。

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

4

6 回答 6

7

我认为 JSLint 告诉你的是,在定义变量之前你不应该使用它们。如果您很高兴它适合您的场景 - 您可以忽略该警告。如果您不确定,请再考虑一下为什么尚未定义此变量。

例如,您是否真的要测试 aVariable 是否设置了值,而不是定义或未定义?

var aVariable = null;

... (一段时间以后)

if (aVariable == null) {
  aVariable = value;
}
于 2010-02-10T07:53:44.727 回答
5

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

解决方案 1

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

所以更好的是简单地这样做:

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

通过不声明“var”并简单地分配 foo,foo 将自动获得全局范围。

解决方案2(特殊情况)

如果显式设置的变量不为零或为假

var foo = foo || "some value";
于 2010-02-11T11:13:47.570 回答
4

您可以使变量(无论如何它是全局的)成为以下的显式成员window

window.aVariable = 'default';

然后

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

如果您不想或无法更改代码,那么我建议您使用实用的 ansatz 并忽略 JSLint 的抱怨,因为您的代码无论如何都可以工作(也就是说,只要您不启用 ECMAScript 5 的严格模式.. .)。

于 2010-02-10T08:05:35.197 回答
2

试试这个:

aVariable = null;

aVariable = typeof(aVariable) == 'undefined' ? null : value;
于 2010-02-10T07:55:46.743 回答
1

在使用它们之前最容易声明变量:

var aVariable;

这将使用“未定义”类型进行初始化,因此未定义的测试仍然有效:

if (typeof aVariable == "undefined") {
    aVariable = value;
}
于 2010-02-10T09:24:26.160 回答
-1

当您使用驼峰式大小写作为变量名时,似乎会触发该错误。如果变量以大写字母 (Variable) 开头或全部小写 (variable),则只会出现“隐含全局”错误。

我不确定通过在变量名上强制使用大小写来暗示什么,尽管您总是必须对 JSLint 持保留态度。您在这里所做的事情是完全有效的,并且是避免意外使用未定义变量的好习惯。

于 2010-02-10T07:56:34.860 回答