Я прочитал вот эту статью:
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. Что не так? Почему не работает?
JavaScript
Помогите, пожалуйста, понять замыкания в JS!
document.getElementById('help')
Ты явно планировал передать переменную help, а не текст 'help'.
Ты явно планировал передать переменную help, а не текст 'help'.
Если написать
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("Ура");
}
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("Ура");
}
Сергей Воробьев
Большое спасибо. А почему если я item сделаю let вместо var, то все будет работать как надо?
Если писать вот так то замыкать там нечему идет простое выполнение функции.
1. Замыкание создается только когда создается функция (иначе были бы не доступны переменные из вне функции)
Упрощенно говоря каждый раз когда встречается и выполняется операторязыка function создается замыкание.
2. Замыкается только лексическое окружение рядом с операторязыка function
3. Статьи на мазиле говеный перевод с английского
читай лучше https://learn.javascript.ru/closure и букв меньше и современнее и смысла на три порядка больше.
1. Замыкание создается только когда создается функция (иначе были бы не доступны переменные из вне функции)
Упрощенно говоря каждый раз когда встречается и выполняется операторязыка function создается замыкание.
2. Замыкается только лексическое окружение рядом с операторязыка function
3. Статьи на мазиле говеный перевод с английского
читай лучше https://learn.javascript.ru/closure и букв меньше и современнее и смысла на три порядка больше.
Сергей Воробьев
Большое спасибо. А почему если я item сделаю let вместо var, то все будет работать как надо?
Саша Жиленков
Ответ на 95% состоит из бреда неграмотного школьника.
Похожие вопросы
- JavaScript. Помогите, пожалуйста понять, где здесь ошибка. Не ругайтесь, я нуб.
- Замыкания в js, помогите разобраться)
- Помогите, пожалуйста, написать js код для обновления ссылки
- Как работает замыкание в js
- Помогите разобрать след код на JS
- Здравствуйте! помогите пожалуйста разобраться с заданием по JSON
- Почему split не работает и правильно ли написана функция? javascript. Помогите, пожалуйста
- Помогите, пожалуйста, с задачей по Java
- Помогите пожалуйста ничего не понимаю
- Помогите определиться с выбором нового языка (JS(TS) vs Java)