看完这篇博客,你将了解
- JS 函数的 this, arguments 是什么
- JS 函数的 call, apply, bind 方法
- 柯里化是什么?
- 柯里化函数的套路
this & arguments
javascript中,每一个声明的函数都有 this 和 arguments 两个隐藏参数
记住以下规则,那么网上其他关于 this 的解释在此时都变得很啰嗦了
this 就是 call 的第一个参数!call 的其他参数组成的伪数组,统称为 arguments
call,apply, bind 方法
call/apply
通常调用函数 xx.fn(a, b)
- 相当于 fn.call(xx, a, b,)
- 相当于 fn.apply(xx, [a, b])
这就是 call 和 apply,两者的区别在于 arguments 是分开传入还是用数组传入
注意:arguments 与 apply 的第二参数 [a, b] 不同,前者是类似数组的对象,后者是数组
bind
调用 call 和 apply 的同时会直接调用函数,而调用 bind 不会,它是返回一个新函数,这个新函数会以 bind 的参数为 this
let fn = function() { console.log(this)}
let fn2 = fn.bind({name: 'simen'})
Function.prototype.bind = function(obj, arguments) {
let self = this
return function() {
self.apply(obj, arguments)
}
}
柯里化与高阶函数
柯里化就是把一个函数变成偏函数
高阶函数就是以函数为参数或返回函数的函数
把一个函数变成偏函数:比如将 f(x,y) 变成 f(x=1)(y) 或 f(y=1)x
//柯里化之前
function sum(x,y){
return x+y
}
//柯里化之后
function addOne(y){
return sum(1, y) //return 之后对应返回的形式,它是一个直接执行的函数语句
}
//柯里化之前
function Handlebar(template, data){
return template.replace('{{name}}', data.name)
}
//柯里化之后
function Handlebar(template){
return function(data){ //return 之后整个 function 对应返回的形式,它是一个单参函数
return template.replace('{{name}}', data.name)
}
}
//柯里化调用
var t = Handlebar('<p>my name is {{name}}</p>')
t({name: 'simen'})
t({name: 'chaos'})
柯里化可以将真实计算拖延到最后再做
柯里化的高级文章:
高阶函数的概念:
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
- 接受一个或多个函数作为输入:forEach sort map filter reduce
- 输出一个函数:lodash.curry
- 不过它也可以同时满足两个条件:Function.prototype.bind
柯里化函数套路
这是柯里化一个函数的模板
function curry(fn) {
return function () { //函数需要参数的话也可以这里声明,里面拿
let params = [...arguments] //函数需要参数的话从这拿
return fn.apply(undefined, params)
}
}
return function() { return 目标返回类型}
暂无评论