Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.01.2020, 15:09
Новичок на форуме
Отправить личное сообщение для jsdump Посмотреть профиль Найти все сообщения от jsdump
 
Регистрация: 15.01.2020
Сообщений: 9

Не работает замыкание
Есть код который ставит алерты на кнопки:
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

почему так?
Ответить с цитированием
  #2 (permalink)  
Старый 15.01.2020, 15:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

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

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

А вот пример замыкания...
for (var i = 0; i < button.length; i++)
button[i].onclick = (function (N) {
   return function(){alert(N);};
})(i);
Ответить с цитированием
  #3 (permalink)  
Старый 15.01.2020, 15:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от 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...
Ответить с цитированием
  #4 (permalink)  
Старый 15.01.2020, 17:24
Новичок на форуме
Отправить личное сообщение для jsdump Посмотреть профиль Найти все сообщения от jsdump
 
Регистрация: 15.01.2020
Сообщений: 9

А почему так и должно быть? Почему поведение функции так меняется из переданного аргумента?
Ответить с цитированием
  #5 (permalink)  
Старый 15.01.2020, 18:47
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

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

Последний раз редактировалось Rise, 15.01.2020 в 18:50.
Ответить с цитированием
  #6 (permalink)  
Старый 15.01.2020, 21:21
Новичок на форуме
Отправить личное сообщение для jsdump Посмотреть профиль Найти все сообщения от jsdump
 
Регистрация: 15.01.2020
Сообщений: 9

И действительно помогло. Из-за одного let всё встало на свои места. Интересно почему?
Ответить с цитированием
  #7 (permalink)  
Старый 15.01.2020, 23:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

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

jsdump, совет, идете в учебник на этом сайте и перечитывайте главу про замыкания до тех пор пока не въедите, иначе постоянно будете спотыкаться.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 16.01.2020, 07:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от jsdump
Интересно почему?
Это хорошо, что тебе это интересно...
Значит самое время начать читать учебник по JS... Одну из ссылок я тебе уже дал выше.
Ответить с цитированием
  #9 (permalink)  
Старый 16.01.2020, 08:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от jsdump
А почему так и должно быть?
Потому, что так сделано и описано в букваре...
https://javascript.ru/tutorial/event...-sobytie-event

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

Просто ты не знаешь основ обработки событий, потому все, что происходит кажется тебе загадкой...
Ответить с цитированием
  #10 (permalink)  
Старый 16.01.2020, 18:10
Новичок на форуме
Отправить личное сообщение для jsdump Посмотреть профиль Найти все сообщения от jsdump
 
Регистрация: 15.01.2020
Сообщений: 9

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

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

Последний раз редактировалось ksa, 17.01.2020 в 07:21. Причина: Оформлен код
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает push! Динамическая вставка TSEH25 ExtJS 5 03.07.2012 13:00
jQyery функция странно работает! Midel Общие вопросы Javascript 4 08.04.2012 13:40
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 15:41
ajax запросы, работает на одних компах и не работает на других vtornik23 AJAX и COMET 2 22.03.2010 18:22
Safari + ajax некорректно работает, а в других работает demi AJAX и COMET 35 15.07.2009 14:11