Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не работает замыкание (https://javascript.ru/forum/misc/79253-ne-rabotaet-zamykanie.html)

jsdump 15.01.2020 15:09

Не работает замыкание
 
Есть код который ставит алерты на кнопки:
for (var i = 0; i < button.length; i++)
button[i].onclick = function () {
alert(i);
}
Если его переписать:

for (var i = 0; i < button.length; i++)
button[i].onclick = function (i) {
alert(i);
}

то вместо последнего i выводит obeject mouseevent

почему так?

ksa 15.01.2020 15:28

Цитата:

Сообщение от jsdump
Не работает замыкание

Не хотел тебя расстраивать... :(
Но у тебя нет замыкания.

Цитата:

Сообщение от jsdump
вместо последнего i выводит obeject mouseevent
почему так?

Потому, что так и должно быть.

А вот пример замыкания...
for (var i = 0; i < button.length; i++)
button[i].onclick = (function (N) {
   return function(){alert(N);};
})(i);

ksa 15.01.2020 15:31

Цитата:

Сообщение от jsdump
вместо последнего i выводит obeject mouseevent
почему так?

Вот тебе пример из учебника...
<button id="button">Нажми Alt+Shift+Click на мне!</button>

<script>
  button.onclick = function(event) {
    if (event.altKey && event.shiftKey) {
      alert('Ура!');
    }
  };
</script>

https://learn.javascript.ru/mouse-events-basics

Только у тебя вместо event - i...

jsdump 15.01.2020 17:24

А почему так и должно быть? Почему поведение функции так меняется из переданного аргумента?

Rise 15.01.2020 18:47

jsdump,
Так исторически сложилось, устаревшее var, замени var на let.
for (let i = 0; i < button.length; i++) button[i].onclick = function () { alert(i) };

jsdump 15.01.2020 21:21

И действительно помогло. Из-за одного let всё встало на свои места. Интересно почему?

Aetae 15.01.2020 23:12

Rise, вот он поменял var на let и всё. А во времена до let, это заставило бы его разобраться как таки устроен js и как с ним правильно работать, что помогло бы сильно в будущем. Эх.

jsdump, совет, идете в учебник на этом сайте и перечитывайте главу про замыкания до тех пор пока не въедите, иначе постоянно будете спотыкаться.

ksa 16.01.2020 07:30

Цитата:

Сообщение от jsdump
Интересно почему?

Это хорошо, что тебе это интересно... :yes:
Значит самое время начать читать учебник по JS... Одну из ссылок я тебе уже дал выше. ;)

ksa 16.01.2020 08:13

Цитата:

Сообщение от jsdump
А почему так и должно быть?

Потому, что так сделано и описано в букваре...
https://javascript.ru/tutorial/event...-sobytie-event

Цитата:

Сообщение от jsdump
Почему поведение функции так меняется из переданного аргумента?

Поведение функции не меняется. Все работает согласно алгоритму, описанному в функции...

Просто ты не знаешь основ обработки событий, потому все, что происходит кажется тебе загадкой...

jsdump 16.01.2020 18:10

Почему не работает код:
var i=0;
{
let i=-5;
for (var i; i < button.length; i++){}
alert(i);
}
alert(i);

Разве нельзя объявлять var после let?


Часовой пояс GMT +3, время: 04:31.