以下代码
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 过于偏执了?
该函数没有对
x
的引用,因此无需每次循环都创建一个新函数。声明该函数一次并将其分配给每个数组元素。
for (let x of data)
{
x.bar = foo;
}
第二个代码不会每次都绑定到相同的
table
。 let
为循环的每次迭代创建一个新的 table
范围。如果您使用 var table
而不是 let table
,它们将具有共享作用域(请参阅 循环内的 JavaScript 闭包 - 简单的实际示例)