Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объясните, почему функция работает именно так. (https://javascript.ru/forum/misc/31048-obyasnite-pochemu-funkciya-rabotaet-imenno-tak.html)

Имя 24.08.2012 16:33

Объясните, почему функция работает именно так.
 
Всем привет.
Есть вопрос:

function addThree(x) {
    return x + 3;
}

function composed(func) {
    return function(x) {
        return func(func(x))
    }
}

var answer = composed(addThree)(4);


И не могу понять, что за странная передача аргумента в функцию - composed(addThree)(4) ??
Почему не вот так composed(addThree(4)) - я уже понял, что так нельзя, попробовал. Просто еще не сталкивался с подобным способом написания. Что в таком случае происходит? Ведь функция composed принимает только один параметр - func? Тогда что за странная запись (addThree)(4) ?

Новичок. Не судите строго :)
Спасибо.

melky 24.08.2012 16:36

первая функция передаётся как аргумент, и возвращается новая функция, которая вызовет первую, передав ей первый аргумент.

т.е. при первой скобке возвратится функция, которая будет вызывать переданную и передавать ей первый аргумент, а вторая скобка вызывает её.

почему запоминается первая функция? это называется замыкание.

Имя 24.08.2012 19:30

спасибо

Kivi 30.08.2012 19:15

Вопрос не по этой теме, но по примеру из данного раздела раздела "Декораторы" сайта learn.javascript.ru:

01 function doublingDecorator(f) {
02 return function() {
03 return 2*f.apply(this, arguments); // (*)
04 };
05 }
06
07 // Использование:
08
09 function sum(a, b) {
10 return a + b;
11 }
12
13 sum = doublingDecorator(sum);
14
15 alert( sum(1,2) ); // 6
16 alert( sum(2,3) ); // 10

в строке 13 мы записываем в переменную sum результат, и теперь данная переменная не должна указывать на функцию function sum(a, b) {...}
Кто может указать (где на сайте или в книге Флэнагана) этот момент можно понять, можно и самостоятельно объяснить.

melky 30.08.2012 21:02

Цитата:

Сообщение от Kivi (Сообщение 201764)
Вопрос не по этой теме, но по примеру из данного раздела раздела "Декораторы" сайта learn.javascript.ru:

01 function doublingDecorator(f) {
02 return function() {
03 return 2*f.apply(this, arguments); // (*)
04 };
05 }
06
07 // Использование:
08
09 function sum(a, b) {
10 return a + b;
11 }
12
13 sum = doublingDecorator(sum);
14
15 alert( sum(1,2) ); // 6
16 alert( sum(2,3) ); // 10

в строке 13 мы записываем в переменную sum результат, и теперь данная переменная не должна указывать на функцию function sum(a, b) {...}
Кто может указать (где на сайте или в книге Флэнагана) этот момент можно понять, можно и самостоятельно объяснить.

Она и не указывает на функцию sum - она указывает на новую функцию, которая будет вызывать sum (она находится в переменной "f").

Она сохраняется благодаря замыканию.

Статья, по которой Я понял замыкания ( я перечитал их около 10 штук), находится на хабре.

Aetae 30.08.2012 21:34

melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)
С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))

melky 30.08.2012 22:24

Цитата:

Сообщение от Aetae (Сообщение 201804)
melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)
С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))

я помню, как я на C# пересел как-то раз ... я пытался передать в функцию два аргумента, а она требовала три - и я гуглил, что же это за фигня такая :) в общем, через месяц я вернулся к JS :)

Kivi 30.08.2012 23:12

Может и так, но я еще не до конца въехал.

Замыкание - Объект с переменными внешней функции можно использовать из внутренней функции. (Илья Кантор)

Однако все эти замыкания представляют интерес лишь
в только что рассмотренной ситуации, когда вложенная функция экспортируется за пределы области видимости, в которой она была определена. Вложенные функции, используемые таким образом, нередко явно называют замыканиями. (Дэвид Флэнаган)


Если, здесь это все используется, то может кто-нибудь терминами глобальных объектов, областей видимости и этапами инициализации это все объяснить.

И еще, это нормальный вариант вот так делать или это пример "индусского кода" (надеюсь поданного специально чтоб лучше запомнилось, когда закипит мозг) ? ( сразу уточню, что не хотел сказать, что Илья Кантор выдает "индусский код", просто для новичков опытные говорят на "индусском") :).

Aetae 30.08.2012 23:19

Нормально. Но дело вкуса. Я, например, люблю замыкания и "замыкаю" всё подряд, а кто-то не любит.))

Kivi 30.08.2012 23:40

Я люблю и обожаю, но еще не все примеры разобрал.

Может, объясниш этот случай.


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