Задать вопрос

Javascript onclick = function — почему такая форма записи?

Вопрос банальный. Почему, когда мы задаем что-нибудь вроде
var myButton = document.querySelector('.btn-primary');
myButton.onclick = function () {
 //do something
}

мы должны писать сначала function () {...}, а не сразу написать тело функции? Знаю, что это связано со внутренним устройством джаваскрипта? Почему работает только так? Просто если написать тело функции (например, вывести что-нибудь в консоль при клике), то консоль выведется сразу, а не при клике -- однако если обернуть console.log в функцию, то все нормально отрабоает. Почему так?
  • Вопрос задан
  • 943 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
мы должны писать сначала function () {...}, а не сразу написать тело функции?

Именно так. Таким образом на действие onclick пользователя вы говорите браузеру:"Выполни-ка вот эту функцию". Мне интересно как вы хотите сразу писать тело функции? Если как-то так:
a.onclick = {
//do somethiong
}

В таком случае вы скажете браузеру:"Вот когда хомосаппиенс нажмет на кнопку, тогда объект". Не совсем понятно, не так ли?
Если вы хотите тело передавать вот так:
a.onclick = //do something
То вы по сути начнете просто перечислять инструкции для браузера. А вы хотите, чтобы эти инструкции были именно для обработчика событий.

Таким образом, чтобы браузер понял, что надо сделать при определенном событии, вы должны передать ему именно функцию, которую он выполнит. Ну конечно можно сделать еще вот так:
a.onclick = func;
function func(){
//do somethong
}

Тут по факту вы тоже говорите браузеру, что надо сделать при событии. Тут главное написать вот так:
a.onlick = func
А не так
a.onlick = func()//Очень плохо, не пишите так
Во втором варианте вы передаете на обработчик уже результат выполненной функции.

И еще лучше использовать addEventListener, Например:
a.addEventListener('click',handler)
function handler(){
//do something
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
1) Нужно использовать addEventListener а не присваивать обработчик напрямую, потому что в єтом случае ты не можешь навесить более одного обработчика
2) Ты присваиваешь результат выполнения конструкции function () {...} им будет функция, а если ті будешь присваивать результат выполнения console.log, то ты присвоишь undefined
Ответ написан
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
мы должны писать сначала function () {...}, а не сразу написать тело функции? Знаю, что это связано со внутренним устройством джаваскрипта? Почему работает только так?

Наверно потому что в JS это такая форма записи функции. Изучите такие понятия как "функция", "процедура", "компиляция", "выполнение", "интерпретация". Определение функции - это компиляция кода в некоторый бинарный вид (промежуточный код, байт-код, машинный код и т.п. - в зависимости от реализации в конкретном ЯП) и дальнейшее использование этого кода по адресу начала этого кода / указателю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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