2010-08-16 10 views
12

Co oznacza poniższy kod JavaScript?Jakie jest znaczenie tego ... "var evt = event || window.event;"

var evt=event||window.event; 
+0

Powiązane: [ReferenceError: zdarzenie nie jest zdefiniowane błąd w Firefoksie] (http://stackoverflow.com/q/20522887/1048572) i [Dlaczego zmienna "event" jest dostępna, nawet jeśli nie została przekazana jako parametr?] (Http://stackoverflow.com/q/33167092/1048572) – Bergi

Odpowiedz

21

Oznacza to, że zmienna evt jest przypisana do wartości event lub event jest zdefiniowana jest przypisana wartość window.event.

Jak to działa, że ​​w javascript, operatory boolowskie nie oceniają wartości true lub false, ale zamiast tego zwracają wartość do ostatniego obiektu, który nie jest falsy * lub wartości falsy.

W związku z tym w pierwszej ocenie wyrażenie event || window.event. Jeśli event jest prawdziwe, wyrażenie nie musi być dalej oceniane, ponieważ OR potrzebuje tylko jednego elementu, aby było prawdziwe. Dlatego zwracana jest wartość event. Jeśli event jest falsy, wówczas prawą stronę operatora OR trzeba ocenić, aby ustalić, czy wynik jest fałszywy. W takim przypadku, jeśli window.event nie jest falsy, to zwracana jest jego wartość.

Jest to bardzo popularny idiom, aby uzyskać obiekt zdarzenia z procedur obsługi zdarzeń. W przeglądarkach zgodnych ze standardami obiekt zdarzenia jest przekazywany jako pierwszy parametr do obsługi zdarzenia. Ale na IE obiekt zdarzenia jest zmienną globalną. Ze względów historycznych wszystkie zmienne globalne są członkami obiektu okna.

więc kod powinien wyglądać mniej więcej tak:

element.onclick = function (event) { 
    var evt = event ||  // use the value of event if available or 
      window.event;// if not assume it's IE and use window.event 

    /* ... */ 
} 

Uwaga: * Wartości falsy w JavaScript są: false, 0, null i niezdefiniowane.

+0

+1 dla ..'historycznych powodów': dwa słowa w celu zdefiniowania wszystkich kompatybilności problemy, resulowanie wystąpień bibliotek między przeglądarkami (jak '$', 'Prototype', 'YUI' itp.) i dlaczego życie jest wtedy łatwiejsze i dlaczego życie jest bardziej skomplikowane. –

3

Kod jest hack, ponieważ Microsoft zdecydował się umieścić swoje wydarzenia w globalnym window.event zamiast przekazywania go jako parametr do funkcji zdarzenia.

Ten kod spróbuje ustawić evt na przekazane zdarzenie (które będzie działać w przeglądarkach innych niż Microsoft), a jeśli okaże się, że jest to null (jak będzie w przypadku przeglądarek Microsoft), następnie złap go od globalnego.

Od tego momentu Twoja funkcja może po prostu używać evt, pomijając różnice między przeglądarkami (przynajmniej te odnoszące się do zdarzeń).

2
var evt=event||window.event; 

Powyższy kod jest skrót do IF else, i jest odpowiednikiem kodu poniżej:

var evt = "nothing valuable yet"; 
if (event) { 
    evt = event; 
} else { 
    evt = window.event; 
} 


Two if else skróty w JavaScript:

var resultIsTrue = true || false; // if first value is true, return first value 
var resultIsFalse = true && false; // if first value is true, return second value