当发现一个未被括号包含的、即时执行的函数时,JSLint会抛出这个"Wrap an immediate function invocation in parentheses"错误。在某些情况下JSHint会抛出这个错误,但是只有设置了 immed 选项为true时。在下面这个例子中我们将匿名函数返回值赋给了变量x:
产生这个错误的原因是约定的缺失。如果不修复这个错误,你的代码仍然能正常的跑起来,但是却会让他人感到困惑。
既然函数语句不能被立即执行,而函数表达式所以,一种通用的用以创建一个立即调用函数表达式的方法是简单的将一个函数语句包裹在括号内。这个打开的括号让其内的函数被解析为一个表达式,而不是一个声明语句:
如果你将上述例子中函数外面的括号去掉,那么会得到一个语法错误。正因如此,如果要立即调用一些不需任何处理就转换为表达式的函数表达式(就如上述第一个例子那样),惯例决定了你必须用括号将其包裹起 -- 为了保持一致性,并清晰的表示总体的表达式是函数的返回值而非对函数本身的引用:
注意,通过解决这个错误你或许会解决相关的另一个问题:"Move the invocation into the parens that contain the function" , 现在看来这个问题将会变得异常简单。
在某些情况下,JSLint和JSHint会提示一个单独的警告而不是预想中的2个。在下面这个例子中,X的值应该会是两个即刻调用函数表达式的返回值的逻辑与后的结果。如果将整个表达式外面包裹的括号去掉,那么就会有两个警告而不是现在的一个:
在JSHint 1.0.0及以上版本中你可以通过一种特殊的语法来忽略所有的警告. 这个警告的ID是 W062. 这意味着你可以通过/*jshint -W062 */
以让JSHint不再提示。