Использование связывания в качестве метода для карри
Я смотрел видео на 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.