高階函數(定義)
如果一個函數符合下面兩個規范,就是高階函數:
如果A函數,接收的參數是一個函數,那么A就是一個高階函數(比如數組方法arr.map()接收的就是一個處理item的函數了)
如果A函數,調用的返回值依然是一個函數,那么A也稱為是高階函數(常見的高階函數:Promise、setTimeout、arr.map()等等數組內置的方法)
函數柯里化(定義)
通過函數調用繼續返回函數的方式,實現多次接收參數最后統一處理的函數編碼形式
(有點像回調地獄的感覺,就是一直then)
一個柯里化的例子:
class Login extends React.Component {
state = { username: '', password: '' } saveFormData = (dataType) => { console.log(dataType); return event => { this.setState({[dataType] : event.target.value}) } } render() { return ( <form action="http://www.atguigu.com" onSubmit={this.handleSubmit}> 用戶名:<input onChange={this.saveFormData('username')} type="text" name="username"/> 密碼:<input onChange={this.saveFormData('password')} type="password" name="password"/> <button>登錄</button> </form> ) } }
例子疑問一:
為什么通過 this.saveFormData('username') 這樣不是會把返回值給onChange函數嗎?
回答:如果saveFormData()函數返回的是一個函數的話就可以
解釋:
-
因為this.saveFormData('username'),把‘username’傳遞作為saveFormData的形參dataType
-
返回給onChange的函數相當於
onChange={ event => { this.setState({[username] : event.target.value}) } }
所以這個event其實就是這個input的元素對象了
例子疑問二:
為什么用{[dataType] : event.target.value}
解釋:
-
假如我們寫的是dataType : event.target.value,其實就相當於是給this.state.dataType賦值了,但是dataType它要表示的是username或者是password,而不是dataType這個變量
比如說 obj = { a: 2} ,可以通過obj.a獲取,也可以通過obj[a]獲取
而下面其實省略了一點東西,完整的是 this[dataType],因為我們把dataType通過參數傳遞進來了
它是this的一個屬性了,我們訪問dataType的時候,其實默認的是通過this.dataType也就是通過
this當前作用域來找到對應的變量的
因為dataType是我們傳遞過來的形式參數,所以通過this.dataType可以獲取到我們的形式參數了
沒有柯里化的例子
class Login extends React.Component {
state = { username: '', password: '' } saveFormData = (dataType, event) => { this.setState({[dataType] : event.target.value}) } handleSubmit = (event) => { event.preventDefault() // 阻止表單提交默認事件 const {username, password} = this.state alert(`你輸入的用戶名是:${username}, 你輸入的密碼是:${password}`) } render() { return ( <form action="http://www.atguigu.com" onSubmit={this.handleSubmit}> 用戶名:<input onChange={event => this.saveFormData('username', event) } type="text" name="username"/> 密碼:<input onChange={event => this.saveFormData('password', event) } type="password" name="password"/> <button>登錄</button> </form> ) } }
