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

m4o*_*vei 4 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
  };
}());
Run Code Online (Sandbox Code Playgroud)

通过JSLint运行它会给出错误:

第5行第12个问题:未定义"add_one".

除了说:

隐含的全局:add_one 5

如果在add_one()功能之前移动功能,get_count()则错误消失.但是,使用上面的代码,在浏览器中运行它时不会产生任何错误.任何人都可以解释为什么JSLint抱怨?

谢谢!
马特

Jac*_*kin 11

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

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

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

  • +1 correctomondo.如果函数低于你的调用代码,只要它们不是作用域的,那么JavaScript就会使函数可用,即`var a = function(){}`.:) (2认同)