【问题标题】:JSLint - Expected to see a statement but instead saw a blockJSLint - 期望看到一个语句,但看到一个块
【发布时间】:2015-07-14 20:10:59
【问题描述】:

我刚刚在 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。
  • 考虑发布您的 jslint 选项,因为对于该代码,jslint 会生成一大堆错误,但不是您提到的那个
  • 也许我应该在发布我的答案之前问一下:报告的错误是哪一行?

标签: javascript code-formatting jslint


【解决方案1】:

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

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

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

附言。如果 JSLint 适合您的需求,请继续使用它,但我觉得有义务向您介绍一些替代方案:

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

【讨论】:

  • 可以关闭这个吗?这不是我写很多函数的方式...
  • 不确定 jslint(我听说它不是很可配置),但请参阅我关于允许配置的替代方案的更新。
  • 看来这不是问题。我将第二行的花括号移到第一行,问题仍然存在。事实上,我只是注意到这个错误的波浪线在第 5 行,其中左大括号肯定与函数语句在同一行...
  • 其他的,我尝试先安装 JSHint,但它似乎没有做任何事情:/
  • @BenWainwright JSHint 必须配置,这可能需要一些时间...jshint.com/docs
【解决方案2】:

这比波浪形括号放置要容易得多。你有一种特殊类型的块——一个空块——而 JSLint 不喜欢空块。它需要声明。

请注意,没有返回值的函数无论如何都会返回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 上运行 sn-p 来检查,但看起来 Crockford 正处于警告中,正在转向新的 JSLint,它比旧的更严厉。现在,我建议在old.jslint.com 测试sn-ps。

如果你这样做了,你会看到,为了让 JSLint “完全满意”,你还需要从第二个函数中删除 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; 
        });    
};

【讨论】:

  • 谢谢!修改为return undefined即可解决问题!
  • 太棒了!很高兴这有效。 JSLint 可以,嗯,特别,但它确实可以提高 JavaScript 代码的质量,尤其是在编码器组中使用时。有很多不同意的地方,但我还没有发现 JSLint 是不可辩驳的错误的情况。祝你好运。
【解决方案3】:

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

{(左大括号)应位于开始的行的末尾 复合语句。

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

JSLint 就是强制执行这些准则。所以绕过它们通常是,但并不总是适得其反,这就是发明 JSHint 的原因。

【讨论】:

  • 好的,感谢您的提示 :) 我认为这不是 jslint 正在解决的问题,请参阅上面答案的评论...
  • 这不是官方的 Javascript 格式化样式,因为不存在这样的东西。
  • 我认为 Douglas Crockford 几乎是推荐格式的“官方”之一,并且大多数编辑器/IDE 按照惯例使用它。您可以将其称为“推荐”而不是“官方”。
  • @Sacho 用推荐代替官方,官方确实太强了。这些规则中的许多规则都可以在指南中找到,因为它们可以避免问题,而不仅仅是个人喜好。
猜你喜欢
  • 2011-06-08
  • 2011-04-13
  • 2018-05-09
  • 2017-12-25
  • 2016-12-31
  • 2012-06-05
  • 2019-07-20
  • 1970-01-01
  • 2020-02-17
相关资源
最近更新 更多