Что означает это… «var evt = event || window.event;»

Что означает следующее в JavaScript?

var evt=event||window.event;
16
задан Justin 16 August 2010 в 12:23
поделиться

2 ответа

Это означает, что переменной evt присваивается значение event или если event не определено, то ему присваивается значение window.event.

Это работает потому, что в javascript булевы операторы не оцениваются как true или false, а вместо этого оцениваются как значение последнего объекта, который не является falsy*, или как значение falsy.

Итак, оператор сначала оценивает выражение event || window.event. Если event истинно, то выражение не нужно оценивать дальше, поскольку для истинности ИЛИ достаточно одного члена. Поэтому возвращается значение event. Если event является ложным, то правая часть оператора OR должна быть оценена, чтобы определить, является ли результат ложным. В этом случае, если window.event не является ложным, то возвращается его значение.

Это очень распространенная идиома для получения объекта события из обработчиков событий. В браузерах, соответствующих стандартам, объект события передается в качестве первого параметра обработчика события. Но в IE объект события является глобальной переменной. А по историческим причинам все глобальные переменные являются членами объекта window.

Поэтому код должен выглядеть примерно так:

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

  /* ... */
}

Примечание: * ложными значениями в javascript являются: false, 0, null и undefined.

24
ответ дан 30 November 2019 в 17:38
поделиться

Код является хаком, потому что Microsoft решила поместить свои события в глобальный window.event вместо того, чтобы передать его в качестве параметра в функцию события.

Таким образом, этот код попытается установить evt в переданное событие (что сработает для браузеров, не относящихся к Microsoft) и, если оно окажется null (как это будет для браузеров Microsoft), он затем возьмет его из глобала.

С этого момента ваша функция может просто использовать evt, не обращая внимания на различия браузеров (ну, по крайней мере, те, которые относятся к событиям).

5
ответ дан 30 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: