在javascript函数式编程中混淆函数

时间:2016-10-24 20:14:44

标签: javascript functional-programming

我是函数式编程的新手,我试图在javascript中学习它。我找到了一些例子并写了我自己的片段,但我不明白为什么它有用。有一个名为whatTheHeckIsThis的函数。有人能告诉我它在做什么或它的目的是什么?请注意,运行此代码时,输​​出为true。

  // h, he, hel, hell, hello
  Console.Write(string.Join(", ", testing)); 

我的困惑是为什么我不能这样做:

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));

4 个答案:

答案 0 :(得分: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 :(得分:1)

您的第二个版本因两个原因无效:

  1. boolFlipper的目的是返回一个新函数,您可以将其分配给另一个变量,然后再调用。
  2. 您的功能没有xy参数。
  3. 要解决#2你可以写:

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

    然后您必须将其称为:

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

    但你还是做不到:

    flipperTester = boolFlipper(checkStrings);
    

    原始片段返回一个闭包,该闭包绑定在someFn等于作为[{1}}参数传递的函数的环境中。然后,您可以将此函数分配给变量,并使用分配给bookFlipper()x的新参数调用它,然后调用保存在y中的函数,返回使用someFn()取消值,并返回此值。

    有关闭包的详细信息,请参阅How do JavaScript closures work?

答案 2 :(得分: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变量时传递了它。

答案 3 :(得分:-1)

对于我们的目的,

boolFlipper是一个函数 decorator :它接受一个函数并修改它以执行其他操作。一个更有启发性的例子可能是记录功能:

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并返回一个与f完全相同的函数,但也会记录结果导致控制台。

由于我们作为程序员是懒惰的,我们不希望每次我们想要编写函数来将其他函数粘合在一起,所以我们编写了一个函数来为我们做,{{3} }。

所以现在我们可以说:

var addAndLog = R.compose(console.log, add);
addAndLog(2, 3); // logs 5 to the console