柯里化函数
- 柯里化函数编程思想
- 如何实现柯里化函数
- 以及所要使用的知识点(必包的保护和保存),以及执行的顺序,bind方法的体会
废话不多说上代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,
body {
width: 100%;
height: 100vh;
margin: 0;
padding: 0;
background-color: orange;
}
</style>
</head>
<body>
<script type="text/javascript">
~function () {
// Function.prototype.mybind = function (context = window, ...outargs) {
// let _this = this
// return function (...innerargs) {
// _this.call(context, ...outargs.concat(innerargs))
// }
// }
Function.prototype.mybind = function (context = window, ...outargs) {
return (...innerargs) => {
this.call(context, ...outargs.concat(innerargs))
}
}
}()
let obj = {
name: "肖扬"
}
function fn(...args) {
console.log(this, args, "[][]")
}
// document.body.onclick = fn.bind(obj, 10, 20)
document.body.onclick = fn.mybind(obj, 10, 20)
// document.body.onclick = fn
// document.body.onclick = function (ev) {
// // console.log(ev)
// fn.call(obj, 10, 20, ev)
// }
function add(n1, n2, n3, n4) {
return n1 + n2 + n3 + n4
}
function currying(fn, length) {
length = length || fn.length;
return function (...args) {
if (args.length >= length) {
fn(...args)
}
return currying(fn.bind(null, ...args), length - args.length)
}
}
let adds = currying(add, 4)
adds(1)(2)(3)(4)
add.bind(null, 1).bind(null, 2).bind(null, 3)(4)
/* 达到条件内参合并 */
function anonymous1(...innerargs) {
$add.call(null, [1, ...innerargs])
}
function anonymous2(...innerargs) {
anonymous1.call(null, [2, ...innerargs])
}
function anonymous3(...innerargs) {
anonymous2.call(null, [3, ...innerargs])
}
anonymous3(4)
anonymous2.call(null, 3, 4)
anonymous1.call(null, 2, 3, 4)
$add.call(null, 1, 2, 3, 4)
console.log(add(1,2)(3,4))
</script>
</body>
</html>