如何读懂并写出装逼的函数式代码
web前端开发
共 5327字,需浏览 11分钟
·
2020-09-08 06:29
先看代码
//正常的版本
function find (x, y) {
for ( let i = 0; i < x.length; i++ ) {
if ( x[i] == y ) return i;
}
return null;
}
let arr = [0,1,2,3,4,5]
console.log(find(arr, 2))
console.log(find(arr, 8))
//函数式的版本
const find = ( f => f(f) ) ( f =>
(next => (x, y, i = 0) =>
( i >= x.length) ? null :
( x[i] == y ) ? i :
next(x, y, i+1))((...args) =>
(f(f))(...args)))
let arr = [0,1,2,3,4,5]
console.log(find(arr, 2))
console.log(find(arr, 8))
JavaScript的箭头函数
(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
// 等于 : => { return expression; }
// 只有一个参数时,括号才可以不加:
(singleParam) => { statements }
singleParam => { statements }
//如果没有参数,就一定要加括号:
() => { statements }
var simple = a => a > 15 ? 15 : a;
simple(16); // 15
simple(10); // 10
let max = (a, b) => a > b ? a : b;
// Easy array filtering, mapping, ...
var arr = [5, 6, 13, 0, 1, 18, 23];
var sum = arr.reduce((a, b) => a + b); // 66
var even = arr.filter(v => v % 2 == 0); // [6, 0, 18]
var double = arr.map(v => v * 2); // [10, 12, 26, 0, 2, 36, 46]
function MakePowerFn(power) {
return function PowerFn(base) {
return Math.pow(base, power);
}
}
power3 = MakePowerFn(3); //制造一个X的3次方的函数
power2 = MakePowerFn(2); //制造一个X的2次方的函数
console.log(power3(10)); //10的3次方 = 1000
console.log(power2(10)); //10的2次方 = 100
function MakePowerFn(power) {
return function(base) {
return Math.pow(base, power);
}
}
MakePowerFn = power => {
return base => {
return Math.pow(base, power);
}
}
MakePowerFn = power => base => Math.pow(base, power)
MakePowerFn = (power) => (
(base) => (Math.pow(base, power))
)
匿名函数的递归
function fact(n){
return n==0 ? 1 : n * fact(n-1);
};
result = fact(5);
function combinator(func) {
func(func);
}
(func) => (func(func))
function fact(func, n) {
return n==0 ? 1 : n * func(func, n-1);
}
fact(fact, 5); //输出120
var fact = (func, n) => ( n==0 ? 1 : n * func(func, n-1) )
fact(fact, 5)
(func, n) => ( n==0 ? 1 : n * func(func, n-1) )
(func, x) => func(func, x)
( (func, x) => func(func, x) ) ( //函数体
(func, n) => ( n==0 ? 1 : n * func(func, n-1) ), //第一个调用参数
5 //第二调用参数
);
动用高阶函数的递归
HighOrderFact = function(func){
return function(n){
return n==0 ? 1 : n * func(func)(n-1);
};
};
fact = HighOrderFact(HighOrderFact);
fact(5);
HighOrderFact ( HighOrderFact ) ( 5 )
fact = function ( hifunc ) {
return hifunc ( hifunc );
} (
//调用参数是一个函数
function (func) {
return function(n){
return n==0 ? 1 : n * func(func)(n-1);
};
}
);
fact(5); //于是我们就可以直接使用了
fact = (highfunc => highfunc ( highfunc ) ) (
func => n => n==0 ? 1 : n * func(func)(n-1)
);
回顾之前的程序
//正常的版本
function find (x, y) {
for ( let i = 0; i < x.length; i++ ) {
if ( x[i] == y ) return i;
}
return null;
}
function find (x, y, i=0) {
if ( i >= x.length ) return null;
if ( x[i] == y ) return i;
return find(x, y, i+1);
}
( (func, x, y, i) => func(func, x, y, i) ) ( //函数体
(func, x, y, i=0) => (
i >= x.length ? null :
x[i] == y ? i : func (func, x, y, i+1)
), //第一个调用参数
arr, //第二调用参数
2 //第三调用参数
)
const find = ( highfunc => highfunc( highfunc ) ) (
func => (x, y, i = 0) => (
i >= x.length ? null :
x[i] == y ? i : func (func) (x, y, i+1)
)
);
其它
评论