溫故而知新 柯里化 與 bind 的認知

2022-01-11 16:01:36 字數 1843 閱讀 6156

什麼是柯里化?

科里化是把乙個多引數函式轉化為乙個巢狀的一元函式的過程。(簡單的說就是將函式的引數,變為多次入參)

const

curry=(

fn,...args

)=>fn.

length

<=

args

.length?fn

(...

args):

curry

.bind

(null,fn

,...

args

);// 想要看懂上面這個函式,重點在於全面理解bind的用法。

// 思路倒是很簡單,就是在引數未蒐集完善之前,通過bind來實現引數蒐集,

// 當蒐集完成時,就可以執行原函式了。

const

add=(x

,y)=>x+

y;const

curryadd

=curry

(add

);curryadd(4

)(4);// 8

關於bind的認知

1)bind不會立即執行函式,而是返回乙個新函式。譬如在 react 中我們經常用 bind 將函式的 this 指向元件本身:

export

default

class

clickoutside

extends

component

getcontainer

(ref

)}

2)除了 this 以外的引數,會把原函式的引數位給占領(擾亂王?鳩佔鵲巢?小三上位?),也就是預設值繫結(賦值):

// demo1: 演示預設繫結 x 和 y 的引數

const

add=(x

,y, z

)=>x+

y + z

;add

.bind

(null

,1, 2

)(3)

// => 6 , 等價於 add(1, 2, 3)

// demo2: 演示多次bind

const

add=(x

,y)=>x+

y;const

myadd

=add

.bind

(null,1

).bind

(null,2

)myadd

()// => 3 , 等價於 add(1, 2)

// demo3: 和...args這種陣列解構結合使用時可別懵了 o(∩_∩)o哈哈~

const

add=

(...

args

)=>

console

.log

(args

,args

.length

);const

myadd

=add

.bind

(null,1

).bind

(null,2

).bind

(null,3

).bind

(null,4

).bind

(null,5

)myadd

()// => [1, 2, 3, 4, 5] 5

這種特性實際上和偏應用很相似,區別僅僅在於偏應用不需要關注this的繫結。

偏應用的目的只有乙個,那就是通過預設值減少函式的引數位,達到簡化函式、惰性函式、可重用函式等目的。

溫故而知新 柯里化 與 bind 的認知

什麼是柯里化?科里化是把乙個多引數函式轉化為乙個巢狀的一元函式的過程。簡單的說就是將函式的引數,變為多次入參 const curry fn,args fn.length args length?fn args curry bind null,fn args 想要看懂上面這個函式,重點在於全面理解bi...

溫故而知新 物件初始化

class的成員變數總是以其宣告的次序被初始化,而不是以建構函式的成員初始化列表的順序被初始化。對於建構函式中的函式體中的 初始化 只能算作是 偽初始化 嚴格地說,成員初始化應該放在成員初始化列表中。color red 問 如何在建構函式的成員初始化列表中初始化基本型別的定長陣列 比如對int ar...

溫故而知新 JQ的節點型別

定義和用法 查詢匹配元素內部所有的子節點 包括文字節點 如果元素是乙個iframe,則查詢文件內容 語法contents 例子 1 查詢所有文字節點並加粗 html hello john,how are you doing?jquery p contents not nodetype 1 wrap ...