函式柯里化

2021-09-19 22:53:19 字數 2971 閱讀 4493

一、柯里化:把接收多個引數的函式變換成接收乙個單一引數的函式(單一引數為多個引數中的第乙個)

函式柯里化思想:乙個js預處理的思想,降低通用性,提高適用性。

特點:引數復用

需要輸入多個引數,最終只需輸入乙個,其餘通過arguments來獲取

提前返回

避免重複去判斷某一條件是否符合,不符合則return 不再繼續執行下面的操作

延遲執行

避免重複的去執行程式,等真正需要結果的時候再執行

function fn()
這裡的this是window,要改變this指向,用bind

function bind(callback,context)

}

核心原理:利用函式執行可以形成乙個不銷毀的私有作用域,把預先處理的內容都存在這個不銷毀的作用域裡面,並且返回乙個小函式,以後要執行的就是這個小函式。

fn.bind(obj,100,200)
思考:如何給bind傳值

具體引數不知道,不能定死資料的個數,使用argments

var outerarg=array.prototype.slice.call(arguments,2);

//利用array的slice方法取到外部傳入引數的第二個及以後多個引數

callback.call(context,outerarg)

二、引數復用

var currying=function(fn)

console.log(arguments)

console.log(args)

return cb

}}function add(a,b,c)

var s=currying(add);

s(1)(2)(3)();

執行結果為:

如果使用args.push(.slice.call(arguments))

對比可以知道args是乙個類陣列物件,使用args.push 每次壓入乙個arguments。並不會對傳入的一系列數字行拆分使用。

而用array.push(),則把每次傳入的數存在陣列裡面。

.slice.call(arguments)這是乙個陣列,裡面只有乙個引數,本例來說是[1],[2],[3]
三、提前返回

var addevent = function(), (capture));

};} else if (window.attachevent) );

};}};

var elbind=addevent();

var span=document.getelementbyid("s");

var div=document.getelementbyid("d");

elbind(span, 'click', function () , false)

elbind(div, 'click', function () , false)

如上面**對於監聽事件的判斷則只會走一次,如果是傳統函式則會多次執行。則真是提前返回的好處。

總結:經測試,上述**var elbind=addevent();就會先判斷一次瀏覽器的環境,然後返回乙個小函式。

之後elbind(span, 'click', function () , false)

elbind(div, 'click', function () , false)

均只執行小函式,不會再多次判斷瀏覽器環境。

四、延遲執行

舉例如下:

var curryscore=function(fn)else

}};var result=0;

var addscore=curryscore(function(){

console.log(this)

console.log(arguments);

for(var i=0;i輸出結果:

這就是第三個特點,延遲執行,再沒有輸入引數時,不計算總結果。等需要計算的時候,再計算。

1、如果使用  fn(allscore);輸出為

this也為window,但是arguments是乙個陣列了,

即[param1,param2,param3] 轉換為 param1,param2,param3

2、補充:

a)     math.max 可以實現得到陣列中最大的一項

因為math.max 引數裡面不支援math.max([param1,param2]) 也就是陣列

這塊在呼叫的時候第乙個引數給了乙個null,這個是因為沒有物件去呼叫這個方法,我只需要用這個方法幫我運算,得到返回的結果就行,.所以直接傳遞了乙個null過去

b)        math.min  可以實現得到陣列中最小的一項

c)        array.prototype.push 可以實現兩個陣列合併

var arr1=new array("1","2","3");

var arr2=new array("4","5","6");

函式柯里化

在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。在直覺上,柯里化聲稱 如果你固定某些引數,你將得到接受餘下引數的乙個函式 柯里化實現的原理 在函式式程式語言中,將函式可以當做物件傳遞呼...

函式柯里化

curry 的概念 只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數先看乙個簡單例子,add函式接受 2 個引數 或者多個 addx函式接受 1 個引數。換而言之,所謂 柯里化 就是把乙個多引數的函式,轉化為單引數函式。將乙個函式轉換為乙個新的函式 非柯里化 function add...

函式柯里化

curry 的概念 只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數先看乙個簡單例子,add函式接受 2 個引數 或者多個 addx函式接受 1 個引數。換而言之,所謂 柯里化 就是把乙個多引數的函式,轉化為單引數函式。將乙個函式轉換為乙個新的函式 非柯里化 function add...