为什么 jshint 会警告从循环内声明的函数调用函数?

问题描述 投票:0回答:1

以下代码

function foo () {}

let data = [];

for (let x of data)
{
  x.bar = function ()
  {
    foo ();
  };
}

在 jshint 中导致此警告

Functions declared within loops referencing an outer scoped variable may lead to confusing semantics. (foo)

我知道 Javascript 对于将变量绑定到循环中创建的函数有不直观的规则。例如(如果我没理解错的话)下面的代码会导致每个函数对象绑定到同一个

table

for (let table of document.getElementsByTagName ("table"))
{
  table.my_function = function ()
  {
     do_something_with (table);
  };
}

我认为 jshint 将这两起案件视为同样可疑。但他们对我来说看起来不一样。这个警告是值得认真对待的,还是 jshint 过于偏执了?

javascript jshint
1个回答
0
投票

该函数没有对

x
的引用,因此无需每次循环都创建一个新函数。声明该函数一次并将其分配给每个数组元素。

for (let x of data)
{
  x.bar = foo;
}

第二个代码不会每次都绑定到相同的

table
let
为循环的每次迭代创建一个新的
table
范围。如果您使用
var table
而不是
let table
,它们将具有共享作用域(请参阅 循环内的 JavaScript 闭包 - 简单的实际示例

© www.soinside.com 2019 - 2024. All rights reserved.