闭包的一个用途:函数柯里化(局部化)
柯里化, Currying(局部化),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
function add(a, b) {
return a + b
}
add(1, 2) // 3
function curryingAdd(a) {
return function (b) {
return a + b
}
}
curryingAdd(1)(2) // 3
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
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