Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не работает замыкание из урока (https://javascript.ru/forum/misc/51610-ne-rabotaet-zamykanie-iz-uroka.html)

TheMilkMan 12.11.2014 14:48

Не работает замыкание из урока
 
Пробую замыкание из урока
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

рони 12.11.2014 14:57

TheMilkMan,
потому скрипт уже есть а элементов ещё нет

TheMilkMan 12.11.2014 14:58

рони,
Почему, два input элемента же есть.

рони 12.11.2014 15:00

TheMilkMan,
либо использовать window.onload либо ставить после элементов с которыми работает скрипт

TheMilkMan 12.11.2014 15:02

рони,
действительно, заработало после того как разместил код под html элементами. Спасибо!

Aetae 12.11.2014 15:04

Цитата:

Сообщение от TheMilkMan (Сообщение 340650)
рони,
Почему, два input элемента же есть.

Их нет, т.к. скрипт работает сразу, не дожидаясь загрузки всей остальной страницы. Решение выше.

TheMilkMan 12.11.2014 15:05

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

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

    return shout;
}

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

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

рони 12.11.2014 15:11

TheMilkMan,
вам нужно понять что как раз таки работает - 13 и 15 строки функционально одинаковы -- они создают новую функцию -- только в первом случае результат никуда не сохраняется чтоб его можно было в дальнейшем использовать

рони 12.11.2014 15:16

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

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

    phrase = "Готово!"

    return shout;
}

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

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

TheMilkMan 12.11.2014 15:21

рони,
Спасибо, теперь понял! :)


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