Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вопрос по замыканию (https://javascript.ru/forum/misc/40461-vopros-po-zamykaniyu.html)

xfreewindx 06.08.2013 18:11

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

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

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;
		}
	};
}

danik.js 06.08.2013 18:39

Ты неверно полагаешь что место вызова функции играет какую-то роль, но это не так. Переменные той области (window.onload), откуда была вызвана функция не будут видны этой функции.

Функция будет видеть только те переменные, что объявлены в ней или выше (по уровню).
Передавай переменные агрументами. Или используй объектный подход.

xfreewindx 06.08.2013 20:05

Спасибо.
Но если выше по уровню, то по идее moveCell должна видеть переменные функции-родителя onkeydown, а та в свою очередь переменные window.onload(). Однако так не происходит. Где-то я что-то не понимаю.


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