Использование связывания в качестве метода для карри

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

function simpleURL(protocol, domain, path) {
  return protocol + "://" + domain + "/" + path;
}

var paths = ["search?query=dogs", "search?query=cats"];

/*
var urls = paths.map(function(path) {
  return simpleURL("http", "www.firefox.com", path);
});
*/

var urls = paths.map(simpleURL.bind(null, "http", "www.firefox.com"));

console.log(urls); // --> ["http://www.firefox.com/search?query=dogs", "http://www.firefox.com/search?query=cats"]

Я понимаю закомментированный способ выполнения вещей, но не urls с привязкой. Я знаю, что связывание возвращает другую функцию, но я не понимаю, каким образом текущее значение, перебираемое массивом (т. Е. "Путь"), устанавливается и используется через связывание.

2 ответа

Когда вы используете Function.prototype.bind как это:

simpleURL.bind(null, "http", "www.firefox.com")

это приводит к новой функции, которая используется в качестве функции обратного вызова, передаваемой в map, Эта новая функция вызывается с двумя дополнительными параметрами: "http" и "www.firefox.com". Так что практически это выглядит примерно так:

paths.map(function(path) {
    return simpleURL.call(null, "http", "www.firefox.com", path);
});

Функция, возвращаемая simpleURL.bind(null, "http", "www.firefox.com"), работает так же, как и исходная функция, но протокол и домен всегда равны "http" и "www.firefox.com". и теперь он принимает только один аргумент, который является значением пути.

Когда вы вызываете функцию map, она передает каждое значение массива в вашу новую функцию, и это значение становится значением path.

Другие вопросы по тегам