为什么JSLint会抱怨未定义/隐含的全局变量?

时间:2010-10-21 03:05:15

标签: javascript jslint

我试图理解为什么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在抱怨?

谢谢!
马特

3 个答案:

答案 0 :(得分:11)

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

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

顺便说一下,我注意到你的结束功能线上有一个小错字: }());应为})();

答案 1 :(得分:1)

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

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

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

  function get_count() { 
    return add_one(); 
  }

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

答案 2 :(得分:1)

你得到* add_one没有被定义*因为JSLint认为函数表达式应该以正确的顺序声明,而另一个问题(“*隐含的全局:add_one 5 *”),你就可以发表评论,例如/ * globals add_one * /位于脚本顶部