【问题标题】:'Variable' was used before it was defined在定义之前使用了“变量”
【发布时间】:2010-02-10 07:50:32
【问题描述】:

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

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

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

我该如何克服这个问题?

我想明确地定义这些变量:

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

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

向下滚动查看答案/解决方案,因为我已经回答了我自己的问题 Stack Overflow 没有显示出来。千万不要错过。

【问题讨论】:

    标签: javascript jslint


    【解决方案1】:

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

    例如,您是否真的要测试 aVariable 是否具有值集,而不是定义或未定义?

    var aVariable = null;
    

    ...(稍后)

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

    【讨论】:

      【解决方案2】:

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

      解决方案 1

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

      最好是这样做:

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

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

      解决方案 2(特殊情况)

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

      var foo = foo || "some value";
      

      【讨论】:

      • 解决方案 2 是否存在性能损失?或者有什么副作用?我想我将无法更改全局 foo?
      • 解决方案 2 似乎有副作用:当 JS 文件具有行 var window = window || {}; 时,页面在 Safari(在 iOS 6.1.3 上)加载后很快崩溃。 Chromium(在 Ubuntu 12.04 上)没有这样的问题。奇怪。
      【解决方案3】:

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

      window.aVariable = 'default';
      

      以后

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

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

      【讨论】:

        【解决方案4】:

        试试这个:

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

        【讨论】:

          【解决方案5】:

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

          var aVariable;
          

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 问题:JSLint 警告说它在定义之前就被使用了。这与骆驼案有什么关系?而且它不是完全有效,因为 JSLint 是对的:变量 is 在定义之前使用。
            • 在否决投票之前更彻底地阅读我的答案。它与 OP 使用的变量名的大小写有关:aVariable。使用写为avariableAVARIABLEAvariable 的变量名运行问题中发布的相同代码,您会注意到JSLint 不再显示错误。
            • 那么,您使用哪种 JSLint? jslint.com 上的那个给出了与拼写无关的相同结果,因为它与拼写无关
            • 我不确定您如何从我这里得到不同的结果。我不使用“不同”的 JSLint。我只是再次尝试并得到相同的结果。准确复制/粘贴 OP 的代码,然后将 typeof(aVariable) 更改为 typeof(avariable),您将看到错误 'aVariable' was used before it was defined. 不再出现。我同意就变量的处理方式而言,拼写无关紧要。我只是指出 JSLint 在报告错误时的行为。
            • 我在jslin.com的主页上将第一个代码sn-p粘贴到JSLint中,得到JSLint warns that it is used before it is defined错误,改了两个aVariableavariable 的实例,重新运行 JSLint 并得到完全相同的错误。也许您忘记更改两行的变量名?
            猜你喜欢
            • 2020-08-07
            • 1970-01-01
            • 1970-01-01
            • 2020-07-25
            • 2020-12-28
            • 1970-01-01
            • 1970-01-01
            • 2015-01-02
            • 1970-01-01
            相关资源
            最近更新 更多