Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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;
		}
	};
}
Ответить с цитированием
  #2 (permalink)  
Старый 06.08.2013, 18:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

Функция будет видеть только те переменные, что объявлены в ней или выше (по уровню).
Передавай переменные агрументами. Или используй объектный подход.
Ответить с цитированием
  #3 (permalink)  
Старый 06.08.2013, 20:05
Аспирант
Отправить личное сообщение для xfreewindx Посмотреть профиль Найти все сообщения от xfreewindx
 
Регистрация: 19.08.2012
Сообщений: 33

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

Последний раз редактировалось xfreewindx, 06.08.2013 в 23:04.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
Вопрос по each() и перебору строк таблицы battrack jQuery 1 09.02.2012 14:30
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49
Вопрос о циклических ссылках (JavaScript -> Dom -> JavaScipt) BlueIce Events/DOM/Window 10 17.02.2010 21:58