Was ist falsch mit der Definition von JavaScript-Variablen innerhalb von if-Blöcken?
Ich habe einige code wie dieser:
if (condition) {
var variable = blah;
}
if (differentcondition) {
var variable = blah;
}
Ist das richtig?
Ich gehe davon aus, dass die variable wäre nicht zugewiesen, wenn die Bedingung nicht true zurückgibt.
JSLint hält, mir mitzuteilen, variable bereits definiert ist.
Mache ich das falsch?
Dank.
OK, Hier ist meine eigentliche Anwendungsfall, ich mache event-delegation wie diese:
$("#container").click(function (event){
if ($(event.target).is('img.class1')) {
var imagesrc = $(event.target).attr('src');
//Do something with imagesrc
}
if ($(event.target).is('img.class2')) {
var imagesrc = $(event.target).attr('src');
//Do something with imagesrc
}
//This condition is mutually exclusive to the above 2
if ($(event.target).is('img.class3')) {
var imagesrc = $(event.target).attr('src');
//Do something with imagesrc
}
//This condition is mutually exclusive to 1 and 2 but not to 3
if ($(event.target).is('img.class4')) {
var imagesrc = $(event.target).attr('src');
//Do something with imagesrc
}
});
Eigentlich diese 2-Klassen schließen sich nicht gegenseitig aus.
Dies funktioniert für mich, aber ist es richtig?
Die Antworten waren sehr informativ, aber ich verstehe immer noch nicht, wie ich das einrichten der Variablen, die hier.
Eigentlich möchte ich auch sagen, dass bestimmte Bedingungen schließen sich gegenseitig aus, und bestimmte Bedingungen nicht.
Wie sollte ich die Struktur dieser?
Wahrscheinlich sollte ich habe dieses Beispiel, von Anfang an.
- Ich würde diese Methode verwenden: var variable = (Bedingung) ? "foo" : "bar";
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil javascript so genannte "Hochziehen", wodurch Ihr code tun Dinge, die Sie nicht Aussehen wie Sie es tun sollten. Im Grunde bedeutet das, dass ein javascript-interpreter bewegen wird, alle var-Deklarationen, unabhängig davon, wo Sie sind im Körper von einer Funktion, um den Anfang der Funktion Körper. Dann wird es alle verschieben-Funktion von Definitionen an die Spitze, knapp alle vars. Dann wird es fertig kompilieren Sie die Funktion.
Putting eine Variable innerhalb einer if-Anweisung, nicht gegen die "Regeln" der Sprache, aber es bedeutet, dass, da der var hochziehen, dass der var wird definiert, unabhängig davon, ob die if-Anweisung die Bedingung erfüllt ist.
Beachten Sie auch, dass hochziehen beinhaltet nicht die Belegung, so wie andere haben darauf hingewiesen, dass der var-Deklarationen werden nach oben und undefiniert, bis Sie erst später vergeben.
Dies ist ein Beispiel für eine Funktion, muss haben schien eine gute Idee zu der Zeit, aber es hat sich mehr verwirrend als hilfreich.
Dies ist, weil Sie in JavaScript Variablen haben nur unterschiedliche Gültigkeitsbereiche innerhalb von Funktionsbausteinen. Im Gegensatz zu anderen Sprachen, wenn die Blöcke nicht über einen anderen Bereich, in JavaScript.
In Ihrem Fall, JSLint, würden Sie sagen, ist die variable schon definiert, da es möglich ist, dass beide Bedingungen erfüllt sind, in welchem Fall Sie würde das überschreiben der Variablen.
Hier ist ein Beispiel, wie die Bereiche Arbeit, in JavaScript:
Nur Funktionen erstellen, innere Umfang. Es kommt noch hairier wie in diesem Beispiel.
Erste Warnung tatsächlich sagen wird nicht definiert. Warum? Da alle Variablen Initialisierungen, die auftreten, in der Funktion initialisiert, undefiniert zu Beginn der Funktion. Das ist der Grund, warum Crockford sagt die Initialisierung aller Variablen so früh wie möglich.
Sodass Ihr code sollte wohl so Aussehen:
Sind die beiden if-Bedingungen gegenseitig ausschließen? Vielleicht möchten Sie verwenden die "else" - Kontrollstruktur:
Dies bedeutet, dass, wenn die erste Bedingung true ist, wird der zweite Teil des Codes nie ausgeführt werden.
Im Allgemeinen, es ist besser die Variablen deklarieren, innerhalb der Struktur, die Sie verwendet werden in. Wenn die variable soll nur innerhalb der if-Anweisung zu deklarieren, es ist in Ordnung, anderenfalls verschieben Sie es außerhalb, zum Beispiel so:
Hinweis: wenn Sie separate ifs ohne else, dann müssen Sie die variable auf einen Standardwert ersten.
In diesem Fall, wie es aussieht, wäre es besser, nest die Bedingungen:
Oder noch besser, verwenden Sie die jQuery event delegation: