React-高階函數_函數柯里化


高階函數_函數柯里化

 

高階函數(定義)

如果一個函數符合下面兩個規范,就是高階函數:

  • 如果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>  ) } } 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM