<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 简单实现,参数只能从右到左传递
function createCurry(func, args) {
//func的参数个数
var arity = func.length;
//上一次调用的参数
var args = args || [];
return function() {
//把当前调用函数所传的参数复制到 _args内,并装换成数组
var _args = [].slice.call(arguments);
//把上一次调用的参数合并到 _args中
[].push.apply(_args, args);
// 如果参数个数小于最初的func.length,则递归调用,继续收集参数
if (_args.length < arity) {
//createdCurry的递归
return createCurry.call(this, func, _args);
}
// 参数收集完毕,则执行func
return func.apply(this, _args);
}
}
//简单的累加
function add(a,b,c){
return a+b+c;
}
//第一种方式
// var _add = createCurry(add,[2,10,6]);
// console.log(_add());
//第二种方式
var _add = createCurry(add);
console.log(_add(2)(10)(6));
//复杂的验证
function check(targetString, reg) {
return reg.test(targetString);
}
var _check = createCurry(check);
//手机
var checkPhone = _check(/^1[34578]\d{9}$/);
//邮箱
var checkEmail = _check(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/);
console.log(checkPhone('183888888'));
console.log(checkEmail('xxxxx@test.com'));
</script>
</body>
</html>
Javascript简单的柯里化
最新推荐文章于 2024-05-23 10:42:32 发布