const sub = (a, b) => a - b;
const reverseSub = flip(sub);
sub(5, 3); // 2
reverseSub(5, 3); // -2
const flip(f) => (a, b) => f(b, a);
flip((a, b) => a - b) => (a, b) => f(b, a);
return function(a, b) {
return sourceFunction(b, a); // результата
}
function sub(a,b){
return a -b;
}
function flip(func){
return function(){
return func.apply(null, Array.from(arguments).reverse());
}
}
alert(flip(sub)(10,5));//-5
function flip(func){//В функцию флип передается нужная функция
return function(){ // создаем новую функцию и возращаем ее
return //Возвращает результат работы функции func
func.apply( // apply позволяет вызвать любую функцию, первый параметр это то что будет this в функции у нас это null, второе это массив аргументов функции
null,
Array.from(arguments).reverse());//arguments это массив аргументов текущей функции, это a и b допустим, Array.from преобразовывает массив аргументов к обычному массиву, а функция reverse, реверсивует все элементы массива, тоесть что было в конце будет в начала и наоборот
}
}
function sub(a,b){
return a -b;
}
function flip(func){
var newFunc = function(){
var reverseArr= [];
for(var i = arguments.length-1; i >= 0;i--)
reverseArr.push(arguments[i]);
var result = func.apply(null, reverseArr);//5 - 10 = -5
return result;
};
return newFunc;
}
alert(flip(sub)(10,5));//
eval
, но лучше не надо const sub = (a, b) => a - b;
const reverseSub = flip(sub);
sub(5, 3); // 2
reverseSub(5, 3); // -2
const flip(f) => (a, b) => f(b, a);
const flip(f) => (a, b) => f(b, a);
const flip = (f) => (a, b) => f(b, a);
var flip = function(f) {
return function(a, b) {
return f(b,a);
}
}
var flip = function(f) {
return f(10,5);
}
var flip = function(f,a,b) {
return f(b,a);
}
var s = flip(sub,10,5);//-5
var flip = function(f) {
return function(a, b) {
return f(b,a);//тут они видны, потому что они есть, она объявлены выше как аргументы функции
}
}
var flip = function(f) {
return f(b,a);//тут они не видны потому что их не существует, нам видна только f как аргмуент функции
}
var a = 15;
var b = 5;
var flip = function(f) {
return f(b,a);//тут они видны потому что мы их объявили, ну опять же тут вернуться только результат, число , а не сама функция
}
function Person(){
this.name = "Vasya Pupkin";
this.sayHello = function(){
alert("Hello "+this.name);
}
}
var v = new Person();
alert(v.name);//Vasya Pupkin
v.sayHello();//Hello vasya pupkin
(return function(a, b))
(return func(a, b))
return function(a, b) {}
return (a,b)=>{};
//или
var newfunc = function(){ /*todo*/};
return newfunc;
return (function(){ return 2+2;})(); //аналог return 4;
//или аналог
var f = function(){return 2+2;}
return f();
или аналог
var f = function(){return 2+2;}
var v = f();
return v;
function flip((a, b) => a - b) {
return function(a, b) {
return sourceFunction(b, a); // результата
}
}
function flip((a, b) => a - b) {
return function(a, b) {
return sourceFunction(b, a); // результата
}
}
function sub(a,b){
return a-b;
}
function subInverse(a,b){
return sub(b,a);
}
function flip() {
return subInverse;
}
var newFunction = flip();
alert(newFunction(10,5));//-5
function sub(a,b){
return a-b;
}
function flip() {
return function subInverse(a,b){//засунули subInverse просто внутрь, даже имя оставили
return sub(b,a);
};
}
var newFunction = flip();
alert(newFunction(10,5));//-5
function sub(a,b){
return a-b;
}
function flip(func) { //Добавили переменную func в которую будет запоминаться наша фукнция
return function (a,b){//Убрали имя функции хотя можно и оставить, сделали ее не именованной
return func(b,a);//вызываем func которая находится в зоне нашем видимости
};
}
var newFunction = flip(sub);//передали нужную нам функцию
alert(newFunction(10,5));//-5
// исходное определение:
const flip(f) => (a, b) => f(b, a);
// можно развернуть:
function flip(sourceFunction) {
return function(a, b) {
return sourceFunction(b, a);
}
}
Функция flip()
принимает аргументом функцию. И возвращает новую функцию.function flip(f) {
// ура, нам дали какую-то исходную функцию!
var sourceFunction = f; // для красоты запишем её в свою переменную
// можно и вызвать её при желании: sourceFunction(4, 5)
// но пока не будем. Рано. Ждём.
// сделаем новую, хакерскую функцию
var hackerFunc = function(a, b) {
// тут пусть всю работу делает старая функция
var result = sourceFunction(a, b);
// стоп. Не то. Надо же аргументы местами поменять
var result = sourceFunction(b, a);
// хакерский результат
return result;
} // конец определения хакер-функции
// вернём теперь хакер-функцию:
return hackerFunc;
}
Вот как flip(f) возващает новую хитрую хакерскую функцию.flip()
возвращает не функцию, а результат работы sourceFunction()
, т.е. там, число, скорее всего.