24.08.2012, 16:33
|
Интересующийся
|
|
Регистрация: 01.07.2011
Сообщений: 11
|
|
Объясните, почему функция работает именно так.
Всем привет.
Есть вопрос:
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) ?
Новичок. Не судите строго
Спасибо.
|
|
24.08.2012, 16:36
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
первая функция передаётся как аргумент, и возвращается новая функция, которая вызовет первую, передав ей первый аргумент.
т.е. при первой скобке возвратится функция, которая будет вызывать переданную и передавать ей первый аргумент, а вторая скобка вызывает её.
почему запоминается первая функция? это называется замыкание.
|
|
24.08.2012, 19:30
|
Интересующийся
|
|
Регистрация: 01.07.2011
Сообщений: 11
|
|
спасибо
|
|
30.08.2012, 19:15
|
|
Интересующийся
|
|
Регистрация: 30.08.2012
Сообщений: 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) {...}
Кто может указать (где на сайте или в книге Флэнагана) этот момент можно понять, можно и самостоятельно объяснить.
|
|
30.08.2012, 21:02
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Kivi
|
Вопрос не по этой теме, но по примеру из данного раздела раздела "Декораторы" сайта 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 штук), находится на хабре.
|
|
30.08.2012, 21:34
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,567
|
|
melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)
С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))
__________________
29375, 35
|
|
30.08.2012, 22:24
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Aetae
|
melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)
С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))
|
я помню, как я на C# пересел как-то раз ... я пытался передать в функцию два аргумента, а она требовала три - и я гуглил, что же это за фигня такая в общем, через месяц я вернулся к JS
|
|
30.08.2012, 23:12
|
|
Интересующийся
|
|
Регистрация: 30.08.2012
Сообщений: 15
|
|
Может и так, но я еще не до конца въехал.
Замыкание - Объект с переменными внешней функции можно использовать из внутренней функции. (Илья Кантор)
Однако все эти замыкания представляют интерес лишь
в только что рассмотренной ситуации, когда вложенная функция экспортируется за пределы области видимости, в которой она была определена. Вложенные функции, используемые таким образом, нередко явно называют замыканиями. (Дэвид Флэнаган)
Если, здесь это все используется, то может кто-нибудь терминами глобальных объектов, областей видимости и этапами инициализации это все объяснить.
И еще, это нормальный вариант вот так делать или это пример "индусского кода" (надеюсь поданного специально чтоб лучше запомнилось, когда закипит мозг) ? ( сразу уточню, что не хотел сказать, что Илья Кантор выдает "индусский код", просто для новичков опытные говорят на "индусском") .
|
|
30.08.2012, 23:19
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,567
|
|
Нормально. Но дело вкуса. Я, например, люблю замыкания и "замыкаю" всё подряд, а кто-то не любит.))
__________________
29375, 35
|
|
30.08.2012, 23:40
|
|
Интересующийся
|
|
Регистрация: 30.08.2012
Сообщений: 15
|
|
Я люблю и обожаю, но еще не все примеры разобрал.
Может, объясниш этот случай.
Последний раз редактировалось Kivi, 31.08.2012 в 00:00.
|
|
|
|