我是函数式编程的新手,我试图在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));
答案 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)
您的第二个版本因两个原因无效:
boolFlipper
的目的是返回一个新函数,您可以将其分配给另一个变量,然后再调用。x
和y
参数。要解决#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