Fork me on GitHub

JSLint Error Explanations

JSLint will hurt your feelings. It's time to make them better!


Missing '()' invoking a constructor

什么时候会产生这个错误?

JSHint在遇到一个new表达式后没有紧随一对括号时,会抛出"Missing '()' invoking a constructor"的错误。以下例子中,我们创建了一个内置的Date构造函数:

为什么会产生这个错误?

这个错误的提出是为了强调一种约定的缺失。如果不解决这个错误你的代码可以正常运行,但是你却违背了代码规范和最佳实践。在ECMAScript5的规范告诉我们new表达式并不需要紧随一对括号。唯一必须要括号的情况是,构造函数中传递了参数 (ES5 §11.2):

MemberExpression :
    ...
    new MemberExpression Arguments

NewExpression :
    MemberExpression
    new NewExpression

Arguments :
    ( )
    ( ArgumentList )

语法可能会有一点让人感到疑惑,但是本质上而言根据上面提到的内容,无结尾的Arguments是可选的。如果你并不需要向构造函数传递任何参数,你可以不添加括号。但是很多代码规范会为了保持代码的统一性而推荐使用括号,而且这样可以更清楚的看到调用了构造函数。

考虑到普通函数(非构造)缺少括号会使得表达式会直接计算该函数的引用,而不是其返回值。而在构造函数处缺少了括号你的代码就会变得缺少自我理解。解决这个问题你可以简单的添加缺少的括号:

There is no standard option to surpress this message. Note that JSLint also raises a warning in this situation, but it uses a more generic "Missing '{a}'" message which is used in several places.

在JSHint1.0.0及以上版本中,你可以通过一种特殊的语法选项来忽略这个警告。这个警告的标示符是W058。也就意味着你可以通过/*jshint -W058 */来告诉JSHint不报告这个错误。


comments powered by Disqus