Javascript JS提示:在循环中声明的函数&;for-in的主体应该封装在if语句中,以从原型中过滤不需要的属性

Javascript JS提示:在循环中声明的函数&;for-in的主体应该封装在if语句中,以从原型中过滤不需要的属性,javascript,Javascript,当我运行JavaScript时,我从JSHINT收到了一些反馈,我希望在理解和改进代码方面得到一些帮助。我发现以下错误: 在引用外部作用域变量的循环中声明的函数可能会导致语义混乱。(食品指数,i,篮子物品,附加物品,食品) 对于此代码- addToBasket[i].addEventListener("click", e => { foodIndex = i; if (!basketItem.includes(foodIndex)

当我运行JavaScript时,我从JSHINT收到了一些反馈,我希望在理解和改进代码方面得到一些帮助。我发现以下错误:

在引用外部作用域变量的循环中声明的函数可能会导致语义混乱。(食品指数,i,篮子物品,附加物品,食品)

对于此代码-

    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()) {