Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.09.2014, 19:31
Аспирант
Отправить личное сообщение для Smike Посмотреть профиль Найти все сообщения от Smike
 
Регистрация: 01.06.2014
Сообщений: 33

замыкания в javascript
Доброго времени суток.

Во многих учебниках и статьях я вижу пример по замыканиям следующего типа:

var greeting = function(name) {
return function() {
console.log("Hello, " + name);
}
}
greeting("Someone")(); // => "Hello, Someone"

В чем преимущество этого решения и что это нам дает?
мы же можем написать такой код и получается то же самое:

var greet = function(name) {
return console.log("Hello, " + name);
}
greet("SomeoneElse"); // => "Hello, SomeoneElse"
Ответить с цитированием
  #2 (permalink)  
Старый 29.09.2014, 19:58
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Конкретно здесь - ни в чем. Тебе просто показали, как это работает.
Ответить с цитированием
  #3 (permalink)  
Старый 29.09.2014, 20:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от Smike
мы же можем написать такой код и получается то же самое
У тебя просто вызов функции... А в примере учебника вызов функции используется как вызов другой функции, которую она вернет.
Именно этот прием и демонстрируют...
Ответить с цитированием
  #4 (permalink)  
Старый 29.09.2014, 23:09
Аспирант
Отправить личное сообщение для Smike Посмотреть профиль Найти все сообщения от Smike
 
Регистрация: 01.06.2014
Сообщений: 33

Понял, как всегда думал, что все намного сложнее.

Спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 29.09.2014, 23:46
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Наверно все не так просто
небольшой пример в котором создается три разных указателя на одну и туже функцию
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <script type="text/javascript">
	var f_1 = function(name){
		return function() {
			alert("alert, " + name);
		}
	};
	// в переменных v_1,v_2,v_3 сохраняется указатель на функцию
	var v_1 = f_1("Some1"); 
	var v_2 = f_1("Some2");
	var v_3 = f_1("Some3");
    </script>

</head>
<body>
		Вызов функции f_1( ); каждый раз создает отдельное замыкание<br>
		т.к. в функции есть внутренняя функция «return function()» то создается замыкание<br>
		т.е. каждый вызов «f_1 = function(name)» будет сохранять текущий скоп у замкнутой функции<br>
		т.е. в каждом замыкании будет сохранятся(в скопе) параметр name<br>
		пока сохраняется ссылка на внутреннюю функцию<br>
	<input type="button" onclick="v_1()" value="первое замыкание" /><br>
	<input type="button" onclick="v_2()" value="второе замыкание" /><br>
	<input type="button" onclick="v_3()" value="первое замыкание" /><br> 
</body>
</html>

Последний раз редактировалось MallSerg, 29.09.2014 в 23:50.
Ответить с цитированием
  #6 (permalink)  
Старый 30.09.2014, 14:23
Аспирант
Отправить личное сообщение для Smike Посмотреть профиль Найти все сообщения от Smike
 
Регистрация: 01.06.2014
Сообщений: 33

так, хорошо. Здесь кажется разобрался.

У меня такой вопрос есть. Если написать такой код:
var f_1 = function(name) {
alert("alert, " + name);
};

остальной js и html оставить неизменным. у меня при загрузке страницы выдает сразу три alert, хотя мы его повесили на событие. как так? =)

этот вопрос наверное уже не относится к замыканиям, но все же.
Ответить с цитированием
  #7 (permalink)  
Старый 30.09.2014, 14:52
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

если сделать как вы сказали, тогда в строках:
var v_1 = f_1("Some1");
var v_2 = f_1("Some2");
var v_3 = f_1("Some3");

происходит происходит вызов трёх alert-ов, а самим переменнам присваеваеться значение undefined
Ответить с цитированием
  #8 (permalink)  
Старый 30.09.2014, 17:50
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Сообщение от Smike
у меня при загрузке страницы выдает сразу три alert
осталось разобраться почему так происходит.
Ответить с цитированием
  #9 (permalink)  
Старый 30.09.2014, 19:11
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

MallSerg, так написали, что непонятно сарказм это или нет
Ответить с цитированием
  #10 (permalink)  
Старый 30.09.2014, 19:33
Аспирант
Отправить личное сообщение для Smike Посмотреть профиль Найти все сообщения от Smike
 
Регистрация: 01.06.2014
Сообщений: 33

считайте, что того сообщения не было
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
хитросплетения Global,контекст,this,Reference kefi Общие вопросы Javascript 109 20.11.2009 23:34