天天看點

js-柯裡化

1.定義:

  把一個接受多個參數的函數變成一個以原函數首參數為參數并且傳回一個函數來參數其他參數。

  簡單就是把一個含有多個參數的函數,變成分步來完成傳參來并且傳回函數的函數

2.例子://将多個參數的函數轉為單一參數的函數

function fn(a,b,c){ return a+b+c }
function curry(fn){
  var args = [];
  return function fe(){
    args = args.concat([].slice.call(arguments,0))
    if(args.length = fn.length) return fn.apply(null,args)
    else fe
  }
}


//延時執行,執行前可以做一些判斷
      
var state = false;
function doSomeThing(fn,state) {
    return function () {
        if(state == true){
            return fn.apply(null,arguments)
        }else {
            return state
        }
    }
}
function add(a,b) {
    return a+b
}
console.log(doSomeThing(add,state)(1,2))
state = true
console.log(doSomeThing(add,state)(1,2))

      
//函數節流(事件節流)  防止多次點選等事件
function curry(fn,delay) {
    var preTime = 0
    return function () {
        var currentTime = parseInt(new Date().getTime())
        if(currentTime - preTime > delay){
            preTime = currentTime
            return fn.apply(null,arguments)
        }
    }
}
function add(a,b) {
    return a+b
}
var curry = curry(add,100)
console.log(curry(1,2))
setTimeout(function () {
    console.log(curry(1,2))
},300)
console.log(curry(1,2))

      
//防止抖動  頁面抖動等
function curry(fn,delay) {
    var loop;
    return function () {
        clearTimeout(loop)
        var args = arguments
        loop = setTimeout(function () {
            fn.apply(null,args)
        },delay)
    }
}
function add(a,b) {
    console.log(a+b)
}
var curry = curry(add,100)
curry(1,2)
curry(3,2)



      

  

3.基礎:

  閉包

  函數作為傳回值

  函數作為參數延時執行

  apply 函數

4.作用:

  參數服用

  計算延時執行

  動态建立函數