2017-09-30 97 views
2

我的代码的工作,但我不希望jshint错误了:环内声明JSHint警告闭包的内部循环使用外部变量

功能引用外部范围的变量可能会导致混淆的语义

  1. 我试过用ES6来解决错误,因为我认为这样可以解决问题。我也配置了我的gruntfile以使用ES6。

  2. 我尝试使用两个环,外环与变量“i”和具有可变“J”

无论工作的内部循环。这里提供

全码:https://jsfiddle.net/rwschmitz/zz7ot3uu/

var hobbies = document.getElementsByClassName("hobbies"); 
var active = false; 

// For mouse input 

for (var i = 0; i < 5; i++) { 
    hobbies[i].onmouseover = function() { 
      hobbies[0].classList.add('hobbies-slide-left'); 
      hobbies[1].classList.add('hobbies-slide-right'); 
      hobbies[2].classList.add('hobbies-slide-left'); 
      hobbies[3].classList.add('hobbies-slide-right'); 
      hobbies[4].classList.add('hobbies-slide-left'); 
    }; 
} 

// For click input 

for (var i = 0; i < 5; i++) { 
    hobbies[i].onclick = function() { 
      hobbies[0].classList.add('hobbies-slide-left'); 
      hobbies[1].classList.add('hobbies-slide-right'); 
      hobbies[2].classList.add('hobbies-slide-left'); 
      hobbies[3].classList.add('hobbies-slide-right'); 
      hobbies[4].classList.add('hobbies-slide-left'); 
    }; 
} 

回答

1

你可以改变你的循环,以这样的事情,使用Array#forEach():如何解决这个问题的其他

var hobbies = Array.from(document.getElementsByClassName('hobbies')); 
var classes = ['hobbies-slide-left', 'hobbies-slide-right']; 
var events = ['mouseover', 'click']; 

function addHobbyClass (hobby, index) { 
    hobby.classList.add(this[index % this.length]); 
} 

function hobbyEventListener() { 
    hobbies.forEach(addHobbyClass, classes); 
} 

hobbies.forEach(function (hobby) { 
    this.forEach(function (event) { 
    this.addEventListener(event, hobbyEventListener); 
    }, hobby); 
}, events); 
+0

是的,这工作。我必须在适当的地方添加7个分号。我对StackOverflow有点新鲜。所以我不确定这是否值得编辑你的答案。无论如何,代码仍然可以与您的解决方案一起工作,并摆脱错误。我会标记为已接受。谢谢! –

+0

哦,我使用了一种叫做“标准”的不同棉绒。它本身并不是一个标准,但它包含JavaScript的ASI规则(自动分号插入)。由于这个问题具体是关于linting,如果您愿意,我可以将它们添加回来。 –

+1

我会说他们重新加入,因为它的主题是w/JSHint。无论哪种方式,真棒,你很快回答,我真的很感激它的男人! –

0

两个例子。

var hobbies = document.querySelectorAll('.hobbies'); 
 
var eventHooks = ['mouseover', 'click']; 
 

 
hobbies.forEach(function(hobby) { 
 
    eventHooks.forEach(function(hook) { 
 
    hobby.addEventListener(hook, function() { 
 
     hobbies[0].classList.add('hobbies-slide-left'); 
 
     hobbies[1].classList.add('hobbies-slide-right'); 
 
     hobbies[2].classList.add('hobbies-slide-left'); 
 
     hobbies[3].classList.add('hobbies-slide-right'); 
 
     hobbies[4].classList.add('hobbies-slide-left'); 
 
    }); 
 
    }); 
 
});

var hobbies = document.getElementsByClassName('hobbies'); 
 
var eventHooks = ['mouseover', 'click']; 
 

 
// Attach events 
 
var attachEvents = function(key) { 
 
    eventHooks.forEach(function(hook) { 
 
    hobbies[key].addEventListener(hook, function() { 
 
     hobbies[0].classList.add('hobbies-slide-left'); 
 
     hobbies[1].classList.add('hobbies-slide-right'); 
 
     hobbies[2].classList.add('hobbies-slide-left'); 
 
     hobbies[3].classList.add('hobbies-slide-right'); 
 
     hobbies[4].classList.add('hobbies-slide-left'); 
 
    }); 
 
    }); 
 
}; 
 

 
// Init 
 
var init = function() { 
 
    // Loop through hobbies 
 
    for (var i = 0; i < hobbies.length; i++) { 
 
    attachEvents(i); 
 
    } 
 
} 
 

 
init();

+1

因为这是关于linting的问题,所以我也会尝试解决非DRY代码('hobbies [hardcodedNumberLiteral] .classList.add(hardcodedString)')的问题,类似于你如何处理'eventHooks'。如果你不介意的话,我真的想把它包括在我的答案中。 –

+0

@PatrickRoberts是的!在你的例子中添加类是非常清洁的。 – Win

+0

感谢您提供多种解决方案!看起来我需要更熟悉forEach方法。 –