Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么JSLint抱怨未定义/隐含的全局变量?_Javascript_Jslint - Fatal编程技术网

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

Javascript 为什么JSLint抱怨未定义/隐含的全局变量?,javascript,jslint,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 }; }()); 通过JSLin

我试图理解为什么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:“添加一个”未定义

并说:

隐含全局:添加一个5

如果在
get\u count()
函数之前移动
add\u one()
函数,则错误会消失。但是,对于上面的代码,在浏览器中运行时不会产生任何错误。有人能解释为什么JSLint在抱怨吗

谢谢

Matt

这是因为
JSLint
使用自顶向下的解析器,而不是全面的JavaScript解释器。 如果它真的被解释了,那么它就不会给你那个错误

add_one
是一个隐含的全局变量,因为解析器还没有遇到该变量,所以它假设您周围的代码将包含该变量。 但是,如果你把它翻过来,那么解析器已经遇到了
add\u one
变量,它就是桃子和奶油:-)

顺便说一下,我注意到您的结束功能行中有一个小错误:
}())
应该是
}()

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

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

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

  function get_count() { 
    return add_one(); 
  }

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

您会得到*add_one not defined*,因为JSLint认为函数表达式应该按正确的顺序声明,而对于另一个问题(“*隐含全局:add_one 5*”),您可以在脚本的顶部添加一条注释,如/*globals add_one*/就足够了。JavaScript使函数在调用代码下方可用,只要它们没有作用域,即
var a=function(){}
:)好的。谢谢雅各布,这完全有道理。现在我明白了,我可以摆脱伤害我感情的JSLint了。谢谢你也修改了我的代码+1.因为JSLint伤害了你的感情。你是个不错的程序员!如果我的理解是正确的,
}()而不是
}()cf。