Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2014, 14:48
Аватар для TheMilkMan
Интересующийся
Отправить личное сообщение для TheMilkMan Посмотреть профиль Найти все сообщения от TheMilkMan
 
Регистрация: 25.06.2013
Сообщений: 11

Не работает замыкание из урока
Пробую замыкание из урока
http://javascript.ru/basic/closure

Первый же пример не работает.
<!doctype html>
<html>
<head>
	<script type="text/javascript">
		function addHideHandler(sourceId, targetId) {
			var sourceNode = document.getElementById(sourceId)
			var handler = function() {
				var targetNode = document.getElementById(targetId)
				targetNode.style.display = 'none';
			}
			sourceNode.onclick = handler
		}


		addHideHandler('test1', 'test2');
	</script>	
</head>
<body>
<input type="button" value="test1" id="test1"/>
<input type="button" value="test2" id="test2"/>
</body>
</html>


В консоли:
Ошибка на строке
sourceNode.onclick = handler;
Cannot set property 'onclick' of null
Ответить с цитированием
  #2 (permalink)  
Старый 12.11.2014, 14:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

TheMilkMan,
потому скрипт уже есть а элементов ещё нет
Ответить с цитированием
  #3 (permalink)  
Старый 12.11.2014, 14:58
Аватар для TheMilkMan
Интересующийся
Отправить личное сообщение для TheMilkMan Посмотреть профиль Найти все сообщения от TheMilkMan
 
Регистрация: 25.06.2013
Сообщений: 11

рони,
Почему, два input элемента же есть.
Ответить с цитированием
  #4 (permalink)  
Старый 12.11.2014, 15:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

TheMilkMan,
либо использовать window.onload либо ставить после элементов с которыми работает скрипт
Ответить с цитированием
  #5 (permalink)  
Старый 12.11.2014, 15:02
Аватар для TheMilkMan
Интересующийся
Отправить личное сообщение для TheMilkMan Посмотреть профиль Найти все сообщения от TheMilkMan
 
Регистрация: 25.06.2013
Сообщений: 11

рони,
действительно, заработало после того как разместил код под html элементами. Спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 12.11.2014, 15:04
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,518

Сообщение от TheMilkMan Посмотреть сообщение
рони,
Почему, два input элемента же есть.
Их нет, т.к. скрипт работает сразу, не дожидаясь загрузки всей остальной страницы. Решение выше.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 12.11.2014, 15:05
Аватар для TheMilkMan
Интересующийся
Отправить личное сообщение для TheMilkMan Посмотреть профиль Найти все сообщения от TheMilkMan
 
Регистрация: 25.06.2013
Сообщений: 11

рони,
еще такой вопрос, в чем отличия?
function makeShout() {
    var phrase = "Превед!"  

    var shout = function() {
        alert(phrase);
    }
    
    phrase = "Готово!"

    return shout;
}

makeShout(); // не работает

shout = makeShout();
shout(); // работает

Последний раз редактировалось TheMilkMan, 12.11.2014 в 15:08.
Ответить с цитированием
  #8 (permalink)  
Старый 12.11.2014, 15:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

TheMilkMan,
вам нужно понять что как раз таки работает - 13 и 15 строки функционально одинаковы -- они создают новую функцию -- только в первом случае результат никуда не сохраняется чтоб его можно было в дальнейшем использовать
Ответить с цитированием
  #9 (permalink)  
Старый 12.11.2014, 15:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

TheMilkMan,
function makeShout() {
    var phrase = "Превед!"

    var shout = function() {
        alert(phrase);
    }

    phrase = "Готово!"

    return shout;
}

makeShout()(); // создаём и сразу запускаем

shout = makeShout();
shout(); // работает
Ответить с цитированием
  #10 (permalink)  
Старый 12.11.2014, 15:21
Аватар для TheMilkMan
Интересующийся
Отправить личное сообщение для TheMilkMan Посмотреть профиль Найти все сообщения от TheMilkMan
 
Регистрация: 25.06.2013
Сообщений: 11

рони,
Спасибо, теперь понял!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS: работает на сервере, не работает из папки -majestic- Общие вопросы Javascript 2 02.08.2012 14:41
Не работает push! Динамическая вставка TSEH25 ExtJS 5 03.07.2012 13:00
jQyery функция странно работает! Midel Общие вопросы Javascript 4 08.04.2012 13:40
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 15:41
ajax запросы, работает на одних компах и не работает на других vtornik23 AJAX и COMET 2 22.03.2010 18:22