JS Veränderbare Variable ist von Schließung zugänglich [Duplizieren]

8

Ich habe also eine Warnung in meinem JS-Compiler, aber könnten Sie mir erklären, ob dies die Art und Weise, wie mein Code ausgeführt wird, tatsächlich beeinflusst?

%Vor%     
Miguel Boland 01.07.2015, 10:18
quelle

2 Antworten

5

Warum erhalten Sie die Warnung

?

Wie @RGraham in den Kommentaren erwähnt, nimmt der js-Compiler an, dass der zweite Parameter zu $.grep() eine Callback-Funktion ist und asynchron ausgeführt wird (zumindest sieht es so aus wie syntaktisch ). Das ist jedoch nicht wahr, da die zweite Funktion tatsächlich eine Filterfunktion ist. Weitere Informationen finden Sie in der API-Dokumentation

Normalerweise erhält man die Warnung Mutable Variable is accessible from closure wenn Verwenden einer async -Funktion innerhalb einer for-Schleife. Das ist, weil die gesamte for loop einen Geltungsbereich hat. Das bedeutet, dass Sie bei jeder Iteration die gleiche Variable erfassen würden. Der Callback erhält also die falschen IDs, weil level (veränderbar) vor dem Aufruf des Callbacks geändert wird. Glücklicherweise ist das nicht der Fall, mit dem Sie es zu tun haben (weil $ .grep nicht asynchron ist):)

  

... könntest du mir erklären, ob dies die Art und Weise meines Codes tatsächlich beeinflusst   wird ausgeführt?

Nein, eine solche Warnung beeinflusst das Ergebnis Ihres Codes nicht.

Sie können die Warnung einfach ignorieren, aber wenn Sie dies weiterhin vermeiden möchten, können Sie den Inhalt in eine Schließung einfügen.

%Vor%     
nalinc 01.07.2015 13:06
quelle
4

Er warnt Sie, dass level geändert werden kann, bevor grep "callback" dazu kommt - natürlich weiß die IDE nicht, dass $.grep keinen Rückruf, sondern eine Filterfunktion benötigt. (Beachten Sie, dass asynchrone Funktionen, die einen Rückruf annehmen, normalerweise die gleiche Signatur haben)

Wenn eine asynchrone Callback-Funktion wäre, würde sie beim Lesen des Wertes von level den zuletzt gesetzten Wert finden - in der letzten Iteration der foor-Schleife und nicht in der Wert vorhanden, wenn Sie den Anruf gesendet haben, was zu Problemen führen würde - daher die Warnung (normalerweise sehr nützlich) Warnung.

    
doldt 01.07.2015 10:29
quelle

Tags und Links