js基础:闭包的一个用途-函数柯里化

闭包的一个用途:函数柯里化(局部化)

概念

柯里化, Currying(局部化),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

用途

  1. 分步, 例如加法
1
2
3
4
5
6
7
8
9
10
11
function add(a, b) {
return a + b
}
add(1, 2) // 3

function curryingAdd(a) {
return function (b) {
return a + b
}
}
curryingAdd(1)(2) // 3
  1. 参数复用, 如正则匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function check(reg, text) {
return reg.test(text)
}
check(/jj/, 'jj') // true
check(/jj/, 'tt') // false

//可以直接写为
function curringCheck(reg) {
return function (text) {
return reg.test(text)
}
}
let checkFunc = curringCheck(/jj/)
checkFunc('jj') // true
checkFunc('js') // false
  1. 延迟运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function.prototype.bind = function () {
var self = this // 保存原函数
var context = [].shift.call(arguments) // 保存需要绑定的this上下文(第一个参数,就是传进来的函数)
var args = [].slice.call(arguments) // 剩余的参数转为数组

return function () {
// 返回一个新函数
// 合并参数
var pars = [].concat.call(args, [].slice.call(arguments))
self.apply(context, pars)
}
}

window.a = 1
window.b = 2
function log() {
console.log(this.a, this.b)
}
let k = log.bind(window)
k() // 1 2

像我们 js 中经常使用的 bind,实现的机制就是 Currying