Показать сообщение отдельно
  #1 (permalink)  
Старый 06.08.2013, 18:11
Аспирант
Отправить личное сообщение для xfreewindx Посмотреть профиль Найти все сообщения от xfreewindx
 
Регистрация: 19.08.2012
Сообщений: 33

вопрос по замыканию
Здравствуйте коллеги!

Помогите понять почему нет замыкания.
Вот кусок кода:

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;
		}
	};
}
Ответить с цитированием