Почему скобки используются для вызова функции внутри тега onClick элементов, но не в свойстве onclick элементов?

Я прочитал в книге, что мы не должны использовать круглые скобки при назначении функции свойству onclick элемента.

<input type = "button" value = "Click" onClick = "sayHello();" id = "button1">
var b1=document.getElementById("button1");
b1.onclick=sayHello;

Почему мы используем круглые скобки внутри атрибута onClick вышеуказанного элемента?

developer.mozilla.org/en-US/docs/Web/Guide/Events/…
Pranav C Balan 01.05.2019 19:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
414
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из-за того, как работают встроенные события (т. е. указанные как атрибуты HTML).

Как правило, это плохая идея по множеству причин (см. Много связанных сообщений), но ответ на ваш вопрос таков.

События, указанные как атрибуты HTML, выполняются в виде строк. По сути, когда элемент щелкнут, строка, указанная в качестве значения атрибута, будет оценивается (это должно дать вам ключ к разгадке одной из причин, по которой это плохая идея). По этой причине вы можете думать о событии, вызывающем запуск следующего JS:

sayHello(); //<-- invoke callback

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

sayHello; //returns reference to callback, to nowhere

Спасибо, это означает, что атрибут onClick и свойство onclick не совпадают.

Code-Lover 01.05.2019 20:12

Атрибуты и свойства — интересная тема. Иногда они идут в ногу; иногда они отделены друг от друга. Ключевой вывод — не использовать встроенные события; это плохая практика.

Mitya 01.05.2019 22:17

Если бы вы написали var b1.onclick=sayHello();, это вызвало бы функцию sayHello немедленно, а не ожидание события click. Вы бы хотели использовать эту технику, если ваша функция sayHello возвращает какое-то значение, которое вы хотите присвоить переменной, хотя это редко применимо при назначении свойства onclick (вероятно, не имеет смысла использовать ключевое слово var, поскольку вы сделать в примере).

Технически вы могли бы получить желаемые результаты от b1.onclick=sayHello();, если бы ваш код выглядел примерно так:

<button id = "b1">invoke sayHello</button>

<script>
    var b1 = document.getElementById("b1");

    function sayHello() {
        return () => { console.info("hello"); };
    }

    b1.onclick=sayHello();
</script>

Это будет запускать console.info всякий раз, когда нажимается кнопка b1.

В случае HTML-атрибутов это строки. Вы можете думать о назначении onClick в атрибуте HTML как о приблизительном эквиваленте этого JavaScript:

b1.onclick = eval("sayHello()");

Другие вопросы по теме