JSLint - 预期会看到一条语句,但却看到了一个块

JSLint - Expected to see a statement but instead saw a block

我刚刚在 Aptana Studio 3 中打开了 'JSLint' 验证。在我的网络应用程序中,我有以下代码:

Sessions.getVars = function()
{
    return $http.get(baseURL)
                .then(function(response) { return response.data; },
                      function(response) { /* TODO Error handling */ });    
};

这是抛出以下错误 Expected to see a statement but instead saw a block

我查看了 this 问题,但这实际上只回答了与 switch/case 语句相关的问题。谁能帮我理解为什么会出现这个错误?

这可能是因为 jslint 强制将函数体的左花括号放在与 function 关键字相同的行上,即

function myFunc () { // Put it here
  // body...
}

这也可能是一个错误,因为解析器无法识别从新行开始的函数主体。

PS。如果 JSLint 适合您的需求,那么请继续使用它,但我觉得有必要向您介绍一些替代方案:

jshint and eslint。 jshint 为已知的陷阱提供可配置的规则并强制执行良好的编码习惯,而 eslint(另外)提供规则以强制执行特定的编码风格(以看似大量的配置选项为代价)。

使用推荐的 JavaScript 格式样式 here 其他样式大多是此样式的变体。大多数编辑器会自动将您的 JS 代码格式化为这种风格或非常接近的风格。

The { (left curly brace) should be at the end of the line that begins the compound statement.

您可以按照推荐的格式设置规则 (example) 避免大量令人讨厌的 JavaScript 错误。它还将帮助其他人阅读此代码。

JSLint 就是为了执行这些准则。因此,绕过它们通常会适得其反,但并不总是如此,这就是发明 JSHint 的原因。

这比曲折的括号放置问题要容易得多。您有一种特定类型的块——一个空块——而 JSLint 不喜欢空块。它需要声明。

请注意,无论如何,一个没有 return 值的函数 returns undefined,因此您可以在不更改函数的情况下拼凑它:

/*jslint sloppy:true, white:true */
/*global Sessions, $http, baseURL */
Sessions.getVars = function()
{
    return $http.get(baseURL)
                .then(function(response) { return response.data; },
                      function(response) { return undefined; });    
};

我想这就是您所看到的。

请注意,JSLint 并不必然 关于您放置波浪线的位置与这些其他答案会让您相信的一样糟糕! ;^) 无论如何,如果您使用 JSLint 指令,这不是一个交易破坏者。

我正在使用 two directives:

  • sloppy -- 允许您跳过使用 "use strict";
  • white -- 允许任何你想要的空格。没有这个,你会看到我认为这里的其他答案是预期的错误,但该错误将是 Expected exactly one space between ')' and '{'.

我想说你可以 运行 JSLint.com 上的代码片段来检查,但看起来 Crockford 正处于他警告的转向新 JSLint 的中间,它比旧的。现在,我建议在 old.jslint.com.

上测试片段

如果你这样做,你会看到,要制作 JSLint "fully happy",你还需要从第二个函数中删除 responsefunction() { return "Something"; });。它也不喜欢未使用的参数。

如果您想保留 TODO 注释,您还需要添加 todo 指令。

添加这两个更改可以得到:

/*jslint sloppy:true, white:true, todo:true */
/*global Sessions, $http, baseURL */
Sessions.getVars = function()
{
    return $http.get(baseURL)
        .then(function(response) { return response.data; },
            function() {
                /* TODO Error handling; add `err` to parameters */ 
                return undefined; 
        });    
};