2017-09-30 1 views
2

Mein Code funktioniert, aber ich will nicht die jshint Fehler mehr:Warnung JSHint über Schließungen innerhalb von Schleifen äußere Variablen

Funktionen innerhalb der Schleife erklärt Referenzierung eine äußere Variable scoped zu verwirrend Semantik führen

  1. Ich habe versucht mit Hilfe von ES6, um den Fehler zu umgehen, weil ich dachte, dass das Problem lösen würde. Ich habe meine Grunt-Datei so konfiguriert, dass sie auch ES6 verwendet.

  2. ich versuchte zwei Schleifen verwendet wird, die äußere Schleife mit variabler ‚i‘ und die innere Schleife mit variabler ‚j‘

Weder gearbeitet.

Voll Code hier zu finden: 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'); 
    }; 
} 

Antwort

1

Sie könnten Ihre Loops zu so etwas wie dies ändern, indem 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

Ja, das funktioniert. Ich musste 7 Semikolons hinzufügen, wo es angebracht war. Ich bin StackOverflow ein wenig neu. Ich bin mir also nicht sicher, ob es sich lohnt, deine Antwort zu bearbeiten oder nicht. Trotzdem funktioniert der Code immer noch mit Ihrer Lösung und beseitigt die Fehler. Ich werde als akzeptiert markieren. Vielen Dank! –

+0

Oh, ich benutze einen anderen Linter namens 'Standard'. Es ist nicht _actually_ ein Standard per se, aber es umfasst JavaScript ASI Regel (automatische Semikolon einfügen). Da es sich bei dieser Frage speziell um Linting handelt, kann ich sie nach Belieben hinzufügen. –

+1

Ich würde sagen, fügen Sie sie zurück rein, weil es zum Thema w/JSHint ist. Wie auch immer, es ist großartig, dass du so schnell geantwortet hast, und ich schätze es wirklich sehr, Mann! –

0

Zwei weitere Beispiele dafür, wie das Problem zu beheben.

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

Da es sich um Linting handelt, würde ich auch versuchen, das Problem mit Nicht-DRY-Code (die Hobbys [hardcodedNumberLiteral] .classList.add (hardcodedString)) zu adressieren, ähnlich wie Sie die 'eventHooks' angesprochen haben. Ich würde das gerne in meine Antwort aufnehmen, wenn es Ihnen nichts ausmacht. –

+0

@PatrickRoberts ja! das Hinzufügen von Klassen ist in deinem Beispiel viel sauberer. – Win

+0

Vielen Dank für die Bereitstellung mehrerer Lösungen! Sieht so aus, als müsste ich mich mit der forEach-Methode vertraut machen. –

Verwandte Themen