14 Stimmen

JavaScript-Kodierungstechnik oder schlechter Code?

Beim Debuggen von Javascript, das von jemand anderem geschrieben wurde, bin ich auf einen Code gestoßen, den ich vorher noch nicht gesehen habe. Hier ist ein Beispiel:

function doSomething() {
    //doing something here...
}

function doItNow() {
    //other logic...
    doSomething && doSomething();    // <=== What's this?
}

Ist der Zweck der 2. Zeile in der Funktion doItNow() zu prüfen, ob doSomething existiert und sie dann aufzurufen? Etwa so:

function doItNow() {
    //other logic...
    if (doSomething) {
        doSomething();
    }
}

JSLint mag es nicht und ich möchte lieber keinen schlechten Code in meiner Anwendung haben. Irgendwelche Einsichten?

0 Stimmen

Ich finde das ziemlich clever, obwohl es die Lesbarkeit des Codes beeinträchtigt. Ich würde das nicht als "schlechten Code" bezeichnen, eher als "schlecht lesbaren Code".

0 Stimmen

Je nach Sprache kann dies als Standardausdruck betrachtet werden.

7voto

Harmen Punkte 21400

Das ist in der Tat eine "Kurzschrift". Die rechte Seite wird nur ausgeführt, wenn die linke Seite als if() Erklärung.

Google Closure Compiler und andere Minifier machen sich dies zunutze; wenn Ihre Eingabe if(a) a() wird es zu folgenden Ergebnissen führen a&&a()


Das Gleiche könnte man tun mit || zum Beispiel:

if( !a ){
  alert('Not a');
}

kann geschrieben werden als

a || alert('Not a');

6voto

Christian C. Salvadó Punkte 763569

Ja, Ihre beiden Beispiele sind "gleichwertig", die && Betreiber führt aus Kurzschlussauswertung .

Ergibt der erste Operandenausdruck eine falsch Wert (wie z.B. null , undefined , 0 , NaN , eine leere Zeichenkette, und natürlich false ), wird der zweite Operandenausdruck no ausgewertet werden, und wenn der Wert wahrheitsgemäß wird der Funktionsaufruf durchgeführt.

Aber wenn doSomething nicht deklariert wurde, sind Ihre beiden Beispiele wird scheitern .

Wenn ein Bezeichner, der nicht deklariert ist, im Code referenziert wird, erhalten Sie eine ReferenceError Ausnahme, z.B.:

function foo() {
  undeclared && undeclared();
}

try {
  foo(); 
} catch (e) {
  alert(e);  // ReferenceError!
}

Wenn Sie das wollen:

  1. Vergewissern Sie sich, dass der Bezeichner existiert, und
  2. Vergewissern Sie sich, dass es sich um aufrufbar

Sie können:

if (typeof doSomething == 'function') {
  doSomething();
}

En typeof Betreiber kann sicher für Bezeichner verwendet werden, die nicht existieren, indem zusätzlich geprüft wird, dass doSomething eine Funktion ist, stellen Sie sicher, dass Sie sie auch aufrufen können.

1voto

theazureshadow Punkte 8699

Der Aufruf von Funktionen (oder Zuweisungen usw.) in Vergleichen ist im Allgemeinen eine schlechte Idee. Normalerweise erwartet man nicht, dass Vergleiche Nebeneffekte haben. Dieser Fall ist so einfach, dass er könnte zu rechtfertigen sein, aber wenn jemand die Konvention nicht versteht, muss er vielleicht auf StackOverflow fragen ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X