Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   замыкания в javascript (https://javascript.ru/forum/misc/50517-zamykaniya-v-javascript.html)

Smike 29.09.2014 19:31

замыкания в 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"

Erolast 29.09.2014 19:58

Конкретно здесь - ни в чем. Тебе просто показали, как это работает.

ksa 29.09.2014 20:31

Цитата:

Сообщение от Smike
мы же можем написать такой код и получается то же самое

У тебя просто вызов функции... А в примере учебника вызов функции используется как вызов другой функции, которую она вернет.
Именно этот прием и демонстрируют...

Smike 29.09.2014 23:09

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

Спасибо!

MallSerg 29.09.2014 23:46

Наверно все не так просто
небольшой пример в котором создается три разных указателя на одну и туже функцию
<!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>

Smike 30.09.2014 14:23

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

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

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

этот вопрос наверное уже не относится к замыканиям, но все же.

Dim@ 30.09.2014 14:52

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

происходит происходит вызов трёх alert-ов, а самим переменнам присваеваеться значение undefined

MallSerg 30.09.2014 17:50

Цитата:

Сообщение от Smike
у меня при загрузке страницы выдает сразу три alert

осталось разобраться почему так происходит.

Dim@ 30.09.2014 19:11

MallSerg, так написали, что непонятно сарказм это или нет

Smike 30.09.2014 19:33

считайте, что того сообщения не было :D


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