函数柯里化
函数里面返回函数(高阶函数)
达到
参数复用
延时执行 多个小括号传入参数
提前确认(兼容性的检测)这三个作用
参数复用
/** 参数复用 **/
function url_curring(protocol,hostname) {
return function (pathname) {
return `${protocol}${hostname}${pathname}`
}
}
const url_https = url_curring('http://','www.wsg3096.com')
const url7 = url_https('/vision')
const url8 = url_https('/gmail')
const url9 = url_https('/responsive')
console.log(url7,url8,url9)
提前确认(兼容性的检测)
/** 提前确认(兼容性的检测)
* IE attachEvent
* 主流都有 addEventListener
* element 哪个元素要进行监听
* type 事件类型
* listener 回调函数
* useCapture 冒泡还是捕获
* **/
const whichEvent = (function () {
if (window.addEventListener){
return function (element,type,listener,useCapture) {
element.addEventListener(type,function (e) {
listener.call(element,e) // 规避this 指向 使用call
},useCapture)
}
} else if(window.attachEvent){
return function (element,type,handler) {
element.attachEvent('on'+type,function (e) {
handler.call(element,e)
})
}
}
})()
延时执行 多个小括号传入参数
/** 延迟执行
* add(1)(2)(3) = 6
* add(1,2,3)(4) = 10
* add(1)(2)(3)(4)(5) = 15
* **/
function add() {
let args = Array.prototype.slice.call(arguments)
let inner = function () {
args.push(...arguments)
return inner
}
inner.toString = function () {
return args.reduce(function (prev,cur) {
return prev + cur
})
// return '123'
}
return inner
}
//toString不生效,其实只有函数返回值参与计算时才会自动调用toString方法,add(1)(2)(3)(4)+'' 这样试试
console.log(add(1)(3)(4)+'')
方式二:
function sum(a){
return(b)=>{
return (c)=>{
return a+b+c
}
}
}
const result = sum(1)(2)(3)
console.log(result);
参考: