JavaScript

Помогите, пожалуйста, понять замыкания в JS!

Я прочитал вот эту статью:
https://developer.mozilla.org/ru/docs/Web/JavaScript/Closures

Меня интересует вот этот пример:
https://jsfiddle.net/v7gjv/13024/?utm_source=website&utm_medium=embed&utm_campaign=v7gjv

Почему если в функции makeHelpCallback убрать создание анонимной функции, то код будет работать неправильно?

Вместо
function makeHelpCallback(help) {
return function() {
showHelp(help);
};
}

Написать вот так
function makeHelpCallback(help) {
return showHelp(help);
}

Здесь же у строки
return showHelp(help);
Есть свое окружение - аргумент help. Что не так? Почему не работает?
document.getElementById('help')

Ты явно планировал передать переменную help, а не текст 'help'.
Samat Zhussupov
Samat Zhussupov
86 175
Лучший ответ
Если написать

function makeHelpCallback(help) {
  return showHelp(help);
}


Тогда вот в этой строчке

document.getElementById(item.id).onfocus = makeHelpCallback(item.help);

сразу вызывается makeHelpCallback(item.help) и получается то же самое, что написать

document.getElementById(item.id).onfocus = showHelp(item.help);

В таком случае функция showHelp - со скобками, тутже выполняется, ничего не возвращает... в итоге получается то же самое, что

document.getElementById(item.id).onfocus = undefined;

Вот оно и не работает)

А в изначальном варианте - оно возвращает функцию, которая будет срабатывать только при фокусе... а не сразу результат вызова функции.

А события (onclick, onfocus...) должны хранить в себе именно функцию = function (){...} которая будет запускаться при этом событии.

А название функции со скобками - означает её вызов. Это будет работать только если вызов функции будет возвращать другую функцию.

В этом полезно копаться для обучения, но для решения подобной задачи можно отбросить все эти замыкания и просто использовать let вместо var )

P.s. простейший пример:

document.onclick = alert("Ура");

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

А такое будет работать только при клике:

document.onclick = function(){
alert("Ура");
}
Болот Джалиев
Болот Джалиев
62 360
Сергей Воробьев Большое спасибо. А почему если я item сделаю let вместо var, то все будет работать как надо?
Если писать вот так то замыкать там нечему идет простое выполнение функции.
1. Замыкание создается только когда создается функция (иначе были бы не доступны переменные из вне функции)
Упрощенно говоря каждый раз когда встречается и выполняется операторязыка function создается замыкание.
2. Замыкается только лексическое окружение рядом с операторязыка function
3. Статьи на мазиле говеный перевод с английского
читай лучше https://learn.javascript.ru/closure и букв меньше и современнее и смысла на три порядка больше.
Сергей Воробьев Большое спасибо. А почему если я item сделаю let вместо var, то все будет работать как надо?
Саша Жиленков Ответ на 95% состоит из бреда неграмотного школьника.