Является ли 'событие' зарезервированным словом в JavaScript? - PullRequest
29 голосов
/ 02 октября 2009

Я новичок в Javascript. И когда я тренировался, я кое-что заметил.

Возьмите эту функцию:

<script type="text/javascript">
    function showChar(sSomeData, oEvent)
    {
        alert (oEvent.keyCode);
        return true;
    }

</script>

Когда я вызываю эту функцию следующим образом:

 <input type="text" id="txtTextBox" onkeypress="return showChar('some text', oEvent);" />

Я получаю ошибку JS: «Ошибка времени выполнения Microsoft JScript:« событие oEvent не определено »*

Но если я переименую oEvent с помощью 'event', например:

<input type="text" id="txtTextBox" onkeypress="return showChar('some text', event);" />

Тогда все работает нормально. Мой вывод «событие» - зарезервированное слово, которое обозначает событие аргумент в Java Script. Но когда я проверил сеть, я не увидел «событие» как зарезервированное слово.

Я ошибаюсь или это действительно не задокументировано как зарезервированное слово?

Спасибо!

Ответы [ 6 ]

28 голосов
/ 02 октября 2009

Это не зарезервированное ключевое слово, но, по крайней мере, это глобальная переменная в IE.

23 голосов
/ 24 декабря 2012

Изначально меня смущало то, что я не понимал, как соглашения для кодирования обработчиков событий на самом деле работали по сравнению с тем, что было именованной переменной , в сочетании с неявными вызовами, выполняемыми обработчиками Javascript когда вы устанавливаете обработчики событий следующим образом:

Хорошо 1

document.getElementById('testId').onkeypress = function(e) {
     console.log(e.which);
}

Выше, ваш браузер неявно передает event обработчику в качестве первого аргумента функции, так что вы можете назвать свой параметр (здесь e) как хотите, если вы согласны , даже если вы сходите с ума, как это:

Хорошо 2; творчески названный

document.getElementById('testId').onkeypress = function(aWhopBopALuWhop) {
     console.log(aWhopBopALuWhop.which);
}

Но из-за того, что event используется в качестве глобального , грубый код, подобный этому, также работает:

Сырая область 1

document.getElementById('testId').onkeypress = function(aWhopBopALuWhop) {
     console.log(event.which);   // <<< decidedly NOT aWhopBopALuWhop
}

Таким образом, вы также можете увидеть вдвойне грубый код, подобный этому:

Cruddy Scoping 2

document.getElementById('testId').onkeypress = function(event) {
     console.log(event.which);
}

Теперь, какой event является event? К сожалению, это не имеет значения. Независимо от области видимости, мы помещаем event в event, поэтому event === event во всем! [sic]

Но это показывает, что event не является зарезервированным словом. Это переменная. Поэтому, когда вы не можете сказать break = "spam";, вы можете сказать event = "spam";. Так что, если вы попытаетесь использовать break, который зарезервирован , он потерпит неудачу.

document.getElementById('testId').onkeypress = function(break) {
     console.log(break.which);
}

Что важно выучить (и что Ionut по сути говорит, я полагаю ), это то, что ваш браузер тихо передает "глобальный" event var в ваш onkeypress обработчик независимо от того, что вы называете в определении функции. Даже если вы не используете свой параметр для доступа к event в своем обработчике, вы все равно можете обращаться к event как к глобальному, как показано в Cruddy 1 & 2 , выше.

Теперь, когда я звонил из html-страны с onkeypress, в моей голове начали смешиваться парадигмы. Здесь нет тихой передачи event в аргументы вашей функции-обработчика. Вы должны явно передать event себя, например, так:

<script>
    function handlerNamed(namedParam) {
        console.log(namedParam.which);
    }
</script>
<input type="text" size="10" onkeypress="handlerNamed(event)"><br />

Никаких других соглашений не работает! И это работает только потому, что браузеры его поддерживают, а не потому, что какой-либо стандарт ECMAscript определяет event (afaik). Вы не можете использовать что-либо из нижеперечисленного, как вы «могли» с .onKeyPress, изменив имя параметра для сопоставления в handlerNamed:

<!-- NONE OF THESE WORK, b/c ONLY event is defined! -->
<input type="text" size="10" onkeypress="handlerNamed(evt)"><br />
<input type="text" size="10" onkeypress="handlerNamed(e)"><br />
<input type="text" size="10" onkeypress="handlerNamed(aWhopBopALuWhop)"><br />

Имеет смысл? Я был в середине слишком сложного jsFiddle , пытавшегося записать это, прежде чем он наконец щелкнул на случай, если это будет полезно.

10 голосов
/ 02 октября 2009

Ну, код:

onkeypress="return showChar('some text', oEvent);"

Является эквивалентом следующего кода JavaScript:

element.onkeypress = function (eventObjectName) {
    return showChar('some text', eventObjectName);
};

Просто браузеры называют аргумент события как event.

Итак, значение атрибута заключено в функцию JS, которая получает аргумент с именем event, который является объектом события.

7 голосов
/ 02 октября 2009

Нет, event не является зарезервированным словом. Это, однако, переменная, которая устанавливается всеми основными браузерами при выполнении обработчика события (такого как onkeypress) узла DOM. В IE это также глобальная переменная.

Типичный кросс-браузерный способ получить событие - по этим направлениям.

На узле DOM:

<div onclick='someFunction(event)'>Click me</div>

Функция обработки событий:

function someFunction(evt) {
  var srcElem = evt.srcElement || evt.target;

  // Code continues
}

Кстати, в вашем примере oEvent - это имя параметра, и поэтому оно действительно в контексте вызываемой функции, а не в контексте вызывающей стороны.

5 голосов
/ 02 октября 2009
0 голосов
/ 13 ноября 2015

Это старый, но, поскольку я наткнулся на него, я думаю, что я мог бы также ответить.

http://www.w3schools.com/js/js_reserved.asp говорит, что событие НЕ является зарезервированным словом, как упоминалось в комментариях выше. Тем не менее, если вы читаете дальше вниз по странице ....

"Зарезервированные слова Windows JavaScript можно использовать вне HTML. Он может использоваться в качестве языка программирования во многих других приложениях.

В HTML вы должны (для переносимости) избегать использования имен объектов и свойств HTML и Windows: "

И «событие» отображается в таблице ниже. Так вы можете использовать это? Конечно. Вы должны использовать это? Нет. Существует множество примеров использования stackoverflow, которые используют событие, но они используют его для ясности. Когда вы используете этот код, вам нужно отредактировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...