На самом деле все довольно просто, когда вы понимаете, что в 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.log("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>