Когда именно круглые скобки нужны при выполнении функции

Я новичок в JavaScript и хотел бы кое-что понять о функциях. Почему при вызове функции для запуска обычно нужно заканчивать скобкой (), а в противном случае просто отобразить содержимое функции. Но при привязке прослушивателя событий к элементу нельзя использовать круглые скобки при вызове функции, и если они используются, она будет запускаться, как только страница загрузится. (то же самое верно при использовании функции setTimeout или SetInterval).

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

Patrick Roberts 24.11.2018 20:11

Итак, когда функция когда-либо вызывалась

Joe Starbright 24.11.2018 20:14

Как я уже сказал, это вызывается фреймворком, а не вами.

Patrick Roberts 24.11.2018 20:16

По сути, так работает javascript. Он знает, как назвать это само по себе

Joe Starbright 24.11.2018 20:20

@PatrickRoberts JavaScript не является фреймворком. Вызов указанного обработчика обрабатывается элементом DOM - на самом деле он вообще не является частью JavaScript.

Scott Marcus 24.11.2018 20:29

@ScottMarcus DOM (или любое другое место, где вы регистрируете обратный вызов) можно назвать фреймворком

Bergi 24.11.2018 20:34

@Bergi Я думаю, что это должно быть более конкретным. Например, JQuery - это библиотека, а Angular - это фреймворк. DOM - это API, а не фреймворк.

Scott Marcus 24.11.2018 20:40

API и фреймворки не исключают друг друга.

Patrick Roberts 24.11.2018 20:42

@PatrickRoberts Как правило, да. stackoverflow.com/questions/724380/framework-vs-api

Scott Marcus 24.11.2018 20:43
«Фреймворк вводит понятие инверсия контроля», о чем мы и говорим. Но достаточно о семантике, эта цепочка комментариев становится смешной, и смысл моего первоначального комментария все еще актуален, даже если вы не согласны с конкретным использованием терминологии.
Patrick Roberts 24.11.2018 20:44
Поведение ключевого слова "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) для оценки ваших знаний,...
0
10
61
2

Ответы 2

На самом деле это довольно просто, если вы поймете, что в 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>

Спасибо. Я просто не понимал, что как только вы на него сослались, фреймворк вызовет его позже автоматически, как указал Патрик Робертс

Joe Starbright 24.11.2018 20:25

@JoeStarbright Это то, что делает .addEventListener(). Его задача состоит в том, чтобы добавлять прослушиватель событий (функция) для элемента, чтобы при возникновении указанного события (в данном случае click) автоматически вызывались любые зарегистрированные обработчики. Идея обращения к функциям является центральной в том, как работает JavaScript.

Scott Marcus 24.11.2018 20:26

Я думаю, это потому, что когда вы определяете функцию, вы можете передать ей некоторые параметры, например

const isUserValid = (username, password) => {
  for (i = 0; i < database.length; i++) {
    if (database[i].username === username && database[i].password === password) {
      return true;
    }
  }
  return false;
}

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

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