Javascript JS提示:在循环中声明的函数&;for-in的主体应该封装在if语句中,以从原型中过滤不需要的属性
当我运行JavaScript时,我从JSHINT收到了一些反馈,我希望在理解和改进代码方面得到一些帮助。我发现以下错误: 在引用外部作用域变量的循环中声明的函数可能会导致语义混乱。(食品指数,i,篮子物品,附加物品,食品) 对于此代码-Javascript JS提示:在循环中声明的函数&;for-in的主体应该封装在if语句中,以从原型中过滤不需要的属性,javascript,Javascript,当我运行JavaScript时,我从JSHINT收到了一些反馈,我希望在理解和改进代码方面得到一些帮助。我发现以下错误: 在引用外部作用域变量的循环中声明的函数可能会导致语义混乱。(食品指数,i,篮子物品,附加物品,食品) 对于此代码- addToBasket[i].addEventListener("click", e => { foodIndex = i; if (!basketItem.includes(foodIndex)
addToBasket[i].addEventListener("click", e => {
foodIndex = i;
if (!basketItem.includes(foodIndex)) {
basketItem.push(foodIndex);
addItemToBasket(food[i], i);
} else {
return;
}
});
}
然后我得到上述警告,并:
for-in的主体应该封装在if语句中,以从原型中过滤不需要的属性
代码:
// show previously stored basket data
let storedBasketItems = JSON.parse(localStorage.getItem("foodInBasket")) || {};
for (const key in storedBasketItems) {
// get corresponding food index
food.forEach(function (food, i) {
if (food.name === storedBasketItems[key].name) foodIndex = i;
});
if (!basketItem.includes(foodIndex)) {
basketItem.push(foodIndex);
food[foodIndex].inBasket = storedBasketItems[key].inBasket;
updateModal(foodIndex);
}
}
代码的完整示例
谢谢它告诉你:
for (const key in storedBasketItems) {
// ...
应该是
for (const key in storedBasketItems) {
if (storedBasketItems.hasOwnProperty(key)) {
// ...
如果您使用var
来声明变量,那么它在循环内部会有问题,因为var
是函数范围的,而不是块范围的。(但您似乎正在使用const
和let
,因此这不是问题;这是JSHint的误报。)
避免中出现警告的另一种方法是迭代对象的
for (const [key, value] of Object.entries(storedBasketItems)) {
// do stuff with key and value
}
您还可以通过使用循环而不是forEach
回调来避免范围警告,例如更改:
food.forEach(function (food, i) {
到
您还可以研究它,我个人认为它在提高代码质量时比JSHint更有用
for (const [i, food] of food.entries()) {