2016-10-24 4 views
1

Я новичок в функциональном программировании, и я пытаюсь изучить его в javascript. Я нашел несколько примеров и написал свой собственный фрагмент, но я не понимаю, ПОЧЕМУ он работает. Существует функция, называемая whatTheHeckIsThis. Может ли кто-нибудь сказать мне, что он делает или какова его цель? Обратите внимание, что при запуске этого кода вывод является истинным.Сложная функция в функциональном программировании javascript

function boolFlipper(someFn){ 
    return function whatTheHeckIsThis(x,y){ 
     return !someFn(x,y); 
    }; 
} 

var checkStrings = function(x, y){ 
    return x === y; 
} 

var flipperTester = boolFlipper(checkStrings); 

var str1 = "this string"; 
var str2 = "that string"; 

console.log(flipperTester(str1, str2)); 

Моя путаница, почему я не могу просто сделать это вместо того, чтобы:

function boolFlipper(someFn){ 
    return !someFn(x,y); 
} 
+1

Так кроме ненужных ругательств, что немного сбивает с толку вас? – UnholySheep

+1

Знаете ли вы, что '!' Делает? Если вы знаете основы функционального программирования, то должно быть очевидно, как это влияет на функцию. – Barmar

+0

Я думаю, что мой вопрос: почему я не могу это сделать вместо этого: функция boolFlipper (someFn) { return! SomeFn (x, y); } – Accribus

ответ

0

В функции JavaScript являются объектами, так что вы можете вернуть их. Когда вы возвращаете функцию, вы получаете объект функции, поэтому вы можете назвать ее как любую другую функцию. Например:

function myFun() { 
    return function() { 
     console.log("test"); 
    }; 
} 

var functionInside = myFun(); 
/* This is like doing: 
var functionInside = function() { 
    console.log("test"); 
}; 
*/ 

functionInside(); // This will execute the function. 

Пример с кодом:

Эта переменная:

var flipperTester = boolFlipper(checkStrings); 

содержит такую ​​функцию:

var flipperTester = function (x,y) { 
    return !someFn(x,y); 
} 

И это что-то подобное до

function flipperTester(x,y) { 
    return !someFn(x,y); 
} 

Так что, когда вы делаете:

flipperTester(str1, str2) 

Вы выполняете эту функцию. Переменная «someFn» внутри есть функция «checkStrings», потому что вы ее передали при инициализации переменной flipperTester.

+0

Я следую этому примеру, но я смущен тем, как передаваемые параметры используются в моем примере. Как @Barmar спрашивал ... откуда взялись X и Y? Я знаю, что передаю их в flipperTester, но я не вижу, как их функция WhatTheHeckIsThis. – Accribus

1

ссылка на whatTheHeckIsthis() будет возвращена и сохранена в flipperTester

После этого flipperTester может быть использован как функция.

Вы можете использовать эту языковую функцию для абстрагирования кода.

Простой пример:

function addTen(x) { return x + 10 } 
function multiplyByTen(x) { return x * 10 } 

... 

var doMath 

// somewhere a user selected something 
if (userInputSaysAdd) doMath = addTen 
if (userInputSaysMultiply) doMath = multiplyByTen 

// this will be the choosen function 
doMath(someValue) 
1

Ваша вторая версия не работает по 2 причинам:

  1. Целью boolFlipper является возвращение новой функции, которую вы можете присвоить другой переменной и позже позвоните.
  2. Ваша функция не имеет параметров x и y.

Для решения # 2 можно было бы написать:

function boolFlipper(someFn, x, y) { 
    return !someFn(x, y); 
} 

Вы бы тогда назвать это нравится:

console.log(boolFlipper(checkStrings, str1, str2)); 

Но вы все еще не мог сделать:

flipperTester = boolFlipper(checkStrings); 

Исходный фрагмент возвращает закрытие, которое связано в среде где someFn равно функции, переданной как аргумент bookFlipper(). Затем вы можете назначить эту функцию переменной и вызвать ее с новыми аргументами, которые назначены x и y, а затем вызывается функция, сохраненная в someFn(), возвращаемое значение сбрасывается с !, и это возвращается.

Для получения дополнительной информации о закрытий см How do JavaScript closures work?

-1

boolFlipper есть, для наших целей, а функция декоратора: она принимает функцию и изменяет его, чтобы сделать что-то другое. Более показательным примером может быть функция протоколирования:

var alsoLogs = f => (...args) => { 
    var result = f(...args); 
    console.log(result); 
    return result; 
}; 

// now we have a function that adds 2 numbers: 
var add = function add(a, b) { return a + b; }; 

// and we want to also log the result 
var addAndLog = alsoLogs(add); // addAndLog is a function, would be the whatTheHeckIsThis from your example 
addAndLog(2, 3); // logs 5 to the console 

Если вы не понимаете, все синтаксис ES6 это нормально, просто понять, что alsoLogs взять функцию п и возвращает функцию, которая делает ту же самую вещь, как F но также записывает результат на консоль.

Поскольку мы, как программисты, ленивы, нам не нужно писать функции для склеивания других функций каждый раз, когда мы хотим это сделать, поэтому мы пишем функцию, чтобы сделать это для нас, compose.

Так что теперь мы можем просто сказать что-то вроде:

var addAndLog = R.compose(console.log, add); 
addAndLog(2, 3); // logs 5 to the console 
Смежные вопросы