2010-02-10 27 views
12

jestem sprawdzenie czy zmienna jest zdefiniowana, czy nie, a jeśli nie jest określona jednoznacznie Zamierzam zdefiniować go wykonując:„Zmienna” została użyta zanim została zdefiniowana

if (typeof(aVariable) == 'undefined') { 
    var aVariable = value; 
} 

Ponieważ zmienna jest nie zdefiniowany JSLint ostrzega, że ​​jest używany przed zdefiniowaniem i właśnie tego chcę.

Jak mogę to przezwyciężyć?

Chcę, aby umożliwić definiowanie tych zmiennych wyraźnie to robi:

<script> 
    var aVariable = value; 
</script> 
<script src="myScript.js"></script> 

Więc każdy, kto będzie zawierać ten skrypt może dostosować niektóre właściwości. Obawiam się, że nie mogę zmienić tej logiki, ponieważ jest już używana w setkach stron internetowych w ten sposób.

Przewiń w dół, aby uzyskać odpowiedzi/rozwiązania, ponieważ odpowiedziałem na własne pytanie, że przepełnienie stosu nie pokazuje tego. Nie przegap ich.

Odpowiedz

5

I znalazłem bardziej akceptowalne odpowiedzi na liście adresowej JSLint, przepraszam za to Boldewyn :)

Rozwiązanie 1

W IE na poziomie skryptu (tj. na plik lub blok skryptu), jeśli zobaczy deklarację "var" podczas fazy analizy (przed wykonaniem), zresetuje wartość tej zmiennej, jeśli już istniała.

Więc lepiej byłoby po prostu to zrobić:

/*global foo: true */ 
if (typeof foo === "undefined") { 
foo = "some value"; 
} 

By nie deklarując „zmienna” i po prostu przypisanie bla, bla automatycznie uzyskać zasięg globalny.

Rozwiązanie 2 (szczególny przypadek)

Jeśli jawnie ustawiona zmienna nie jest zerowa lub fałsz

var foo = foo || "some value"; 
+0

Czy dla rozwiązania 2 występuje kara za wydajność? Czy jakieś efekty uboczne? Przypuszczam, że nie byłbym w stanie zmienić globalnego foo? – Vanuan

+0

Rozwiązanie 2 wydaje się mieć efekt uboczny: strona uległa awarii wkrótce po załadowaniu w przeglądarce Safari (na iOS 6.1.3), gdy plik JS miał wiersz 'var window = window || {}; '. Chromium (na Ubuntu 12.04) nie miało takiego problemu. Dziwne. –

7

Myślę, że JSLint mówi, że nie należy używać zmiennych przed ich zdefiniowaniem. Jeśli jesteś szczęśliwy, że jest to właściwe w twoim scenariuszu - możesz zignorować to ostrzeżenie. Jeśli nie masz absolutnej pewności, pomyśl jeszcze, dlaczego ta zmienna nie jest jeszcze zdefiniowana.

Czy na przykład chcesz przetestować, czy zmienna ma ustawioną wartość, czy nie jest lub nie jest zdefiniowana?

var aVariable = null; 

... (trochę później)

if (aVariable == null) { 
    aVariable = value; 
} 
2

Spróbuj tego:

aVariable = null; 

aVariable = typeof(aVariable) == 'undefined' ? null : value; 
-1

Błąd wydaje się być wyzwalane podczas korzystania z wielbłąda obudowę do nazwy zmiennej. Jeśli uruchamiasz zmienną wielką literą (zmienną) lub zmienisz ją na małą (zmienną), otrzymujesz błąd "domniemany globalny".

Nie jestem pewien, co próbuje zasugerować, wymuszając obudowę na nazwie zmiennej, ale zawsze trzeba wziąć JSLinta z przymrużeniem oka. To, co tu robisz, jest całkowicie poprawne i jest dobrą praktyką, aby uniknąć przypadkowego użycia niezdefiniowanych zmiennych.

+0

Pytanie: * JSLint ostrzega, że ​​stosuje się go, zanim zostanie zdefiniowany *. Jak to się ma do przypadku wielbłąda? I jest to * nie * całkowicie poprawne, ponieważ JSLint ma rację: zmienna * jest * używana przed zdefiniowaniem. – Boldewyn

+1

Przeczytaj uważniej moją odpowiedź przed głosowaniem w dół. Jest to związane z obudową nazwy zmiennej używanej przez OP: 'aVariable'. Uruchom ten sam kod umieszczony w pytaniu o nazwie zmiennej zapisanej jako "avariable", "AVARIABLE" lub "Avariable", a zauważysz, że JSLint nie wyświetla już błędu. –

+0

Więc, którego JSLint używasz? Ten pod adresem http://www.jslint.com/ daje ten sam wynik niezależnie od ortografii, ponieważ nie ma nic wspólnego z pisownią *. – Boldewyn

4

Można zrobić zmienną (to globalny tak) jawnym członkiem window:

window.aVariable = 'default'; 

a później

if (! ('aVariable' in window)) { 
    window.aVariable = 'new value'; 
} 

Jeśli nie chcą lub nie mogą zmienić kod, a następnie I "zasugeruj pragmatyczny ansatz i zignoruj ​​skargi JSLinta, ponieważ twój kod będzie działał tak czy inaczej (to znaczy, dopóki nie włączysz ścisłego trybu ECMAScript 5 ...).

1

Najprostsza zadeklarować zmienne przed dokonaniem jakichkolwiek korzystania z nich:

var aVariable; 

ten zostanie zainicjowany z typu „nieokreślonej”, więc nieokreślone testy będą nadal działać:

if (typeof aVariable == "undefined") { 
    aVariable = value; 
} 
Powiązane problemy