JSHint的"函数声明不应该放在块中"太宽泛了吗?

Han*_*ans 4 javascript function block jshint

我理解为什么将函数声明放在CONDITIONAL块中是不好的,但有没有理由建议不要在独立块中放置一个函数声明(除了可能导致混淆的参数,因为JS不是块作用域):

{
   function foo() {};
}
Run Code Online (Sandbox Code Playgroud)

我这样做的原因是为了实现Sublime Text中代码的任意部分的代码折叠.

Ben*_*aum 8

不,它不是"广泛的".这是语言语法.您上面的代码会导致未指定的行为,并可能在不同的引擎中出现不一致.它在大多数引擎中都可以像你期望的那样工作,但是ECMAScript的特定化禁止它的语法.

改为使用表达式:

{
   var foo = function(){}; // legal ECMAScript, unlike the declaration
}
Run Code Online (Sandbox Code Playgroud)

引用带注释的规范:

注意:已知几种广泛使用的ECMAScript实现支持将FunctionDeclaration用作Statement.然而,在应用于此类FunctionDeclarations的语义中的实现之间存在显着且不可调和的变化.由于这些不可调和的差异,使用FunctionDeclaration作为Statement会导致代码在实现中无法可靠地移植.建议ECMAScript实现不允许使用FunctionDeclaration,或在遇到此类用法时发出警告.ECMAScript的未来版本可以定义用于在Statement上下文中声明函数的替代可移植方法.使用带有函数表达式的变量.

至于sublime文本,您可以折叠带注释的注释,例如.