【问题标题】:JSHint referencing an outer scopeJSHint 引用外部作用域
【发布时间】:2019-03-09 17:38:25
【问题描述】:

嗨,我对 JSHint 有问题,导致总是得到 ​​p>

在引用外部范围变量的循环中声明的函数可能会导致语义混乱。 (美元,总计)。 我的函数调用是

var a;
a.each(function (c) {
    if (c.length == 0) return;
    for (var index in c) {
        var test = {};

        a.each(function (e) {
            var idx = $(e).data('index');
            if (idx in test) {
                test[idx] += $(e).data('key');
            } else {
                test[idx] = $(e).data('key');
            }
        });
    }
});

我知道这个问题,因为我在回调中访问了测试变量,但是有没有解决方案,重写代码或告诉 JSHint 不要抛出警告

【问题讨论】:

  • 您可以在一般情况下禁用此规则,也可以仅针对这部分代码禁用此规则。
  • 我认为 JSHint 不会为您引用的代码发出警告(其网站上的实时功能证实了这一点)。也许如果它在其他一些代码中(特别是循环),但不是单独的。您没有在该代码的循环中声明函数。
  • @T.J.Crowder 是的,我改变了功能

标签: javascript jshint


【解决方案1】:

可能应该是很少理论上。在大多数情况下(比如这个),这个提示根本没有用,可以放心地忽略(或禁用)。

罕见的情况是这样的:

 for(var i = 0; i < 10; i++) { // loop
   setTimeout(function() { // callback
      console.log(i); // outer reference
   }, 100);
}

并且 JSHint 在这种情况下会尝试向您发出警告,但是对于这种合理的情况触发警告的场景经常发生,然后警告根本没有用(就像 jQuery 的全局一样)。

【讨论】:

  • “罕见”,因为它经常发生,我们不断将人们指向this question 及其答案。
  • 我很失望,当函数中使用的变量在与正在创建的函数相同的范围内声明为 let 时,它仍然会引发警告。 :-|它应该足够聪明,知道这不会导致它警告的问题。 (我想我可以做一个 PR,但这不是我使用的工具,而且我有很多事情要做,所以......)
  • (内疚。我对开源有什么问题。“它应该......”“......但我没有时间......”:-D)
  • @T.J.Crowder 有一段时间,Internet Explorer 或 Microsoft Edge 都支持let 语法并使用var 语义实现它。我忘记是哪一个了,但也许这就是警告仍然适用于let 的原因。
  • @PatrickRoberts - 它是 IE9+(是的,包括 IE11)。这是一个非常的好点。真的很期待 IE 最终在几年内完全无关紧要(以及 Edge 切换到 Chromium 和 V8)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2023-03-08
  • 2013-09-12
  • 2013-06-30
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多