вопрос по замыканию
Здравствуйте коллеги!
Помогите понять почему нет замыкания. Вот кусок кода:
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, время: 10:21. |