Я новичок в JavaScript и хотел бы кое-что понять о функциях. Почему при вызове функции для запуска обычно нужно заканчивать скобкой (), а в противном случае просто отобразить содержимое функции. Но при привязке прослушивателя событий к элементу нельзя использовать круглые скобки при вызове функции, и если они используются, она будет запускаться, как только страница загрузится. (то же самое верно при использовании функции setTimeout или SetInterval).
Итак, когда функция когда-либо вызывалась
Как я уже сказал, это вызывается фреймворком, а не вами.
По сути, так работает javascript. Он знает, как назвать это само по себе
@PatrickRoberts JavaScript не является фреймворком. Вызов указанного обработчика обрабатывается элементом DOM - на самом деле он вообще не является частью JavaScript.
@ScottMarcus DOM (или любое другое место, где вы регистрируете обратный вызов) можно назвать фреймворком
@Bergi Я думаю, что это должно быть более конкретным. Например, JQuery - это библиотека, а Angular - это фреймворк. DOM - это API, а не фреймворк.
API и фреймворки не исключают друг друга.
@PatrickRoberts Как правило, да. stackoverflow.com/questions/724380/framework-vs-api



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На самом деле это довольно просто, если вы поймете, что в JavaScript функции - это данные, а также блоки вызываемого кода. Это означает, что вы можете передавать их, как если бы вы передавали число 10 или строку "test".
Когда призывая - функция, вы должны включать круглые скобки.
foo(); // Invokes the foo function
Когда ссылка функция (как данные, которые будут где-то использоваться), вы
не надо. Обратные вызовы событий являются примерами обращения к функциям. В следующем примере строка "click" и функция foo передаются в качестве аргументов (данных) методу .addEventListener() некоторого элемента. В этом элементе теперь должен быть зарегистрирован foo как функция обратного вызова для вызова, если / когда произойдет событие click этого элемента. Мы не хотим вызывать foo прямо сейчас, мы просто хотим, чтобы элемент знал, какую функцию, возможно, вызвать позже.
element.addEventListener("click", foo); // References foo as the click event callback
function returnAfunction(){
// When this function is invoked, it will return
// (as data) another function:
return function(){
console.info("You did it!");
};
}
// Here, notice that the second argument does have parenthesis after it.
// This is because we want the function to run right now and whatever its
// returned value is will then become the actual event callback for the
// button element.
document.querySelector("button").addEventListener("click", returnAfunction());<button type = "button">Click me!</button>Спасибо. Я просто не понимал, что как только вы на него сослались, фреймворк вызовет его позже автоматически, как указал Патрик Робертс
@JoeStarbright Это то, что делает .addEventListener(). Его задача состоит в том, чтобы добавлять прослушиватель событий (функция) для элемента, чтобы при возникновении указанного события (в данном случае click) автоматически вызывались любые зарегистрированные обработчики. Идея обращения к функциям является центральной в том, как работает JavaScript.
Я думаю, это потому, что когда вы определяете функцию, вы можете передать ей некоторые параметры, например
const isUserValid = (username, password) => {
for (i = 0; i < database.length; i++) {
if (database[i].username === username && database[i].password === password) {
return true;
}
}
return false;
}
и это верно, когда вы хотите выполнить функцию. Но когда вы добавляете прослушиватель событий, вы автоматически вызываете функцию для выполнения (т.е. щелкаете)
Когда вы инициализируете прослушиватель событий или инициализируете тайм-аут или интервал, вы нет вызывает функцию. Вы передаете функцию фреймворку для вызова в назначенное время.