Итак, у меня есть небольшая функция JavaScript, которую мне нужно понять, как кодировать, как вызов. По сути:
function me() { // imp this function code }
var isSame1 = me("123")("321") === "123 321";
var isSame2 = me("321")("123") === "321 123";
Желаемый результат - мы хотим, чтобы оба параметра isSame были истинными. Итак, из того, что я понимаю до сих пор, функция me () должна сначала возвращать функцию (какая-то форма рекурсии, которую я себе представляю), а затем каким-то образом строку, чтобы объединить результирующие строки (в реальном примере есть некоторые манипуляции со строками во время функция me (), но мне не нужна помощь с этой частью).
Я чувствую, что есть функция JavaScript, которую я здесь четко не вижу. Я знаю, что могу вернуть функцию как объект и вызвать ее, что является действительно изящной функцией, но меня смущает обработка / передача строки другой функции с последующим ее возвратом в конце.
Может ли кто-нибудь указать мне в правильном направлении, на что обращать внимание. Не хочу, чтобы на него ответили полностью за меня, просто хочу, чтобы мне дали правильную область исследования.
Gerneio
Да, вы правы, me возвращает функцию, которой передается строковый аргумент. Сама эта функция должна возвращать строку, представляющую строку после ===.
Это в основном про карри
@AlexanderNied Спасибо, это именно то, что мне нужно! В остальном Currying тоже кажется применимым, но, насколько я понимаю, это слишком новая функция.
Каррирование @Gerneio - это не «особенность», это техника. Это тоже не ново - оно буквально предшествует JS. Наконец, ссылка Alexacnder Neid полезна лишь частично, поскольку она как бы связана с тем, как реализовано каррирование.
@vlaz, может быть, и так, но он получил именно то, что мне нужно.
@Gerneio - без проблем, рад подсказать. Но, заметьте, утверждение, что каррирование - это «слишком новая функция», не является точным - каррирование - это не функция как таковая, а шаблон проектирования в функциональном программировании. Связанный блог в ответе Патрика Роберта просто показывает, как выполнять каррирование в «вкусе» JavaScript ES6.
@AlexanderNied круто, спасибо за информацию, видел ES6 и протестировал этот тип реализации в Google Script, но он не работал, поэтому сделал предположение слишком быстро.
Кроме того, @vlaz верен - я поделился тем постом, в котором он поделился версией того, что вы искали, а не потому, что ваше решение специально связано с закрытием. Вероятно, лучшей ссылкой для обмена было бы stackoverflow.com/questions/36314/what-is-currying. Извините, что я объединил эти идеи для вас.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Каррирование в JavaScript довольно просто. Просто верните функцию с ограниченной областью действия из me().
Например, чтобы реализовать каррированное добавление с помощью замыкания, вы можете написать такую функцию:
function add (a) {
return b => a + b
}
console.info(add(3)(4))Или см. Ниже решение проблемы.
function me (a) { return b => `${a} ${b}` } console.info(me(123)(321)) console.info(me(321)(123))
Надеюсь, это поможет вам найти то, что вы ищете.
Каррирование кажется новой функцией языка, закрытие более применимо в целом, хотя, спасибо!
Каррирование @Gerneio - не новая языковая функция. Вы можете карри использовать стрелочные функции или обычные функции, просто с синтаксической точки зрения проще использовать стрелочные функции.
Нет, каррирование передает параметры с отдельными вызовами, например (...)(...), а не (..., ...). Замыкания - это области вложенных функций в результате того, что функция возвращает другую функцию, именно так вы реализуете каррированную функцию.
@Gerneio, это совершенно разные вещи. Каррирование изменяет функцию для приема аргументов меньше, чем она уже делает, но вместо «нормального» результата дает вам новую функцию, которая примет остаток. Это также называется частичным приложением, но эти два понятия все еще не являются синонимами.
Для каррирования и частичного применения: 2ality.com/2011/09/currying-vs-part-eval.html
@AlexanderNied, спасибо, я действительно пытался гуглить и ссылаться, но не нашел.
Каррирование просто возвращает функцию, которая затем вызывается с последующим набором аргументов. Это не уменьшает количество аргументов, а просто дает возможность выполнить код перед следующим вызовом функции или выполнить его немедленно. Например, если вы вызвали me('foo'), он вернет только функцию, которая будет выполнена позже. Вы бы выполнили его сразу после возврата, если бы вы сделали me('foo')('bar') (второй набор круглых скобок выполняет возвращаемую функцию).