【问题标题】:Why does JSLint complain about undefined/implied global variable?为什么 JSLint 抱怨未定义/隐含的全局变量?
【发布时间】:2011-04-28 09:25:57
【问题描述】:

我试图理解为什么 JSLint 在以下示例中抱怨隐含的全局变量:

var TEST = (function () {
  var count = 0;

  function get_count() { 
    return add_one(); 
  }

  function add_one() {
    count += 1;
    return count;
  }

  return { 
    get_count: get_count
  };
}());

通过 JSLint 运行会报错:

第 5 行字符 12 处的问题:'add_one' 未定义。

还有话说:

隐含全局:add_one 5

如果您将 add_one() 函数移到 get_count() 函数之前,错误就会消失。但是,使用上面的代码,当您在浏览器中运行它时不会产生任何错误。谁能解释为什么 JSLint 会抱怨?

谢谢!
马特

【问题讨论】:

    标签: javascript jslint


    【解决方案1】:

    这是因为JSLint 使用了Pratt Parser, 自上而下的解析器,而不是成熟的 JavaScript 解释器。 如果它被真正解释,那么它不会给你那个错误。

    add_one 是一个隐含的全局变量,因为解析器尚未遇到该变量,因此它假定您的周围代码将具有该变量。 但是,如果你把它翻过来,那么解析器已经遇到了add_one 变量,而且都是桃子和奶油:-)

    顺便说一句,我注意到您的关闭函数行中有一个小错字: }()); 应该是 })();

    【讨论】:

    • +1 修正。如果函数在您的调用代码之下,只要它们没有作用域,JavaScript 就会使函数可用,即var a = function() { }。 :)
    • 啊啊啊啊好吧。谢谢雅各布,这完全有道理。现在我明白我可以通过 JSLint 伤害我的感情。也感谢您更正我的代码!
    • +1 表示 JSLint 伤害了你的感情。你不是一个糟糕的程序员!
    • 如果我的理解是正确的,推荐}()); 胜过})(); cf。 stackoverflow.com/questions/1450721/solution-for-jslint-errors/…
    【解决方案2】:

    我更改了声明方法的顺序,它将解决您的问题。正如另一个答案中提到的,一些 JavaScript 解析使用自上而下的方法来读取代码,类似于 C 编程语言的方式。现代解释器和编译器使用 2 pass 方法。第一步是将方法读取/编译到内存中。如果它遇到任何它不知道的方法调用,它将查看内存中的整个方法集以确定它是否存在。我建议修复订单,因为虽然它可能不会导致问题,但它会随着更改更快地将方法加载到内存中。

    var TEST = (function () {
      var count = 0;
    
      function add_one() {
        count += 1;
        return count;
      }
    
      function get_count() { 
        return add_one(); 
      }
    
      return { 
        get_count: get_count
      };
    }());
    

    【讨论】:

      【解决方案3】:

      您得到 *add_one not defined* 因为 JSLint 认为函数表达式应该以正确的顺序声明,而对于另一个问题(“*Impied global: add_one 5*”),您只需添加 /* 之类的注释即可globals add_one */ 在你的脚本顶部

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-14
        • 2015-08-08
        相关资源
        最近更新 更多