Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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) ?

Новичок. Не судите строго
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 24.08.2012, 16:36
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

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

почему запоминается первая функция? это называется замыкание.
Ответить с цитированием
  #3 (permalink)  
Старый 24.08.2012, 19:30
Интересующийся
Отправить личное сообщение для Имя Посмотреть профиль Найти все сообщения от Имя
 
Регистрация: 01.07.2011
Сообщений: 11

спасибо
Ответить с цитированием
  #4 (permalink)  
Старый 30.08.2012, 19:15
Аватар для Kivi
Интересующийся
Отправить личное сообщение для Kivi Посмотреть профиль Найти все сообщения от Kivi
 
Регистрация: 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) {...}
Кто может указать (где на сайте или в книге Флэнагана) этот момент можно понять, можно и самостоятельно объяснить.
Ответить с цитированием
  #5 (permalink)  
Старый 30.08.2012, 21:02
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 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 штук), находится на хабре.
Ответить с цитированием
  #6 (permalink)  
Старый 30.08.2012, 21:34
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,567

melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)
С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 30.08.2012, 22:24
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Aetae Посмотреть сообщение
melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)
С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))
я помню, как я на C# пересел как-то раз ... я пытался передать в функцию два аргумента, а она требовала три - и я гуглил, что же это за фигня такая в общем, через месяц я вернулся к JS
Ответить с цитированием
  #8 (permalink)  
Старый 30.08.2012, 23:12
Аватар для Kivi
Интересующийся
Отправить личное сообщение для Kivi Посмотреть профиль Найти все сообщения от Kivi
 
Регистрация: 30.08.2012
Сообщений: 15

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

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

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


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

И еще, это нормальный вариант вот так делать или это пример "индусского кода" (надеюсь поданного специально чтоб лучше запомнилось, когда закипит мозг) ? ( сразу уточню, что не хотел сказать, что Илья Кантор выдает "индусский код", просто для новичков опытные говорят на "индусском") .
Ответить с цитированием
  #9 (permalink)  
Старый 30.08.2012, 23:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,567

Нормально. Но дело вкуса. Я, например, люблю замыкания и "замыкаю" всё подряд, а кто-то не любит.))
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 30.08.2012, 23:40
Аватар для Kivi
Интересующийся
Отправить личное сообщение для Kivi Посмотреть профиль Найти все сообщения от Kivi
 
Регистрация: 30.08.2012
Сообщений: 15

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

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

Последний раз редактировалось Kivi, 31.08.2012 в 00:00.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему то работает, то нет? gyunduz Общие вопросы Javascript 0 22.01.2011 16:08
Некорректно работает функция для создания элементов exec Общие вопросы Javascript 4 13.07.2010 11:15
jQuery не так работает на сервере dial jQuery 2 19.11.2009 15:19
Функция не возвращает false, почему? Vitaly jQuery 3 05.07.2009 16:05
почему не работает <body onload=test()> Ichigeki Общие вопросы Javascript 11 29.10.2008 13:49