вопрос по замыканию
Здравствуйте коллеги!
Помогите понять почему нет замыкания. Вот кусок кода: window.onload = function() { createMatrix(); // зажжем ячейку var row = 2; var col = 7; setCell(row, col, true); // обработка передвижений document.body.onkeydown = function(e) { moveCell(e.keyCode); }; } Функция moveCell: function moveCell(keyCode) { switch (keyCode) { case 39: if (col % 20 === 0) return; setCell(row, col, false); col++; setCell(row, col, true); break; case 37: if (col === 1) return; setCell(row, col, false); col--; setCell(row, col, true); break; case 38: if (row === 1) return; setCell(row, col, false); row--; setCell(row, col, true); break; case 40: if (row % 20 === 0) return; setCell(row, col, false); row++; setCell(row, col, true); break; } } Проблема в том что переменные row и col не видны в замыкании. Отладчик показывает, что самого замыкания нет. Соответственно при выполнении функции moveCell возникает ошибка. До этого код был такой, как показано ниже. Переменные row и col были видны в замыкании и все работало. Смысл манипуляции - хотел вынести все в отдельную функцию moveCell window.onload = function() { createMatrix(); // зажжем ячейку var row = 2; var col = 19; setCell(row, col, true); // обработка передвижений document.body.onkeydown = function(e) { switch (e.keyCode) { case 39: if (col % 20 === 0) return; setCell(row, col, false); col++; setCell(row, col, true); break; case 37: if (col === 1) return; setCell(row, col, false); col--; setCell(row, col, true); break; case 38: if (row === 1) return; setCell(row, col, false); row--; setCell(row, col, true); break; case 40: if (row % 20 === 0) return; setCell(row, col, false); row++; setCell(row, col, true); break; } }; } |
Ты неверно полагаешь что место вызова функции играет какую-то роль, но это не так. Переменные той области (window.onload), откуда была вызвана функция не будут видны этой функции.
Функция будет видеть только те переменные, что объявлены в ней или выше (по уровню). Передавай переменные агрументами. Или используй объектный подход. |
Спасибо.
Но если выше по уровню, то по идее moveCell должна видеть переменные функции-родителя onkeydown, а та в свою очередь переменные window.onload(). Однако так не происходит. Где-то я что-то не понимаю. |
Часовой пояс GMT +3, время: 15:17. |