What is arrow function and why you should use it
2018-04-25
๊ฐ์ธ์ ์ธ ๊ณต๋ถ ๋ ธํธ๋ก, ์ค๋ฅ๊ฐ ์์ ์ ์์ต๋๋ค.
es6์์ ์๊ฐ๋ arrow function๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๊ฐ๊ฒฐํ๊ฒ ํจ์๋ฅผ ์ ์ํ ์ ์๋ค.
/* using function keyword */
function method() {
// do something...
}
/* ES6 arrow function */
const method = () => {
// do something...
}
์ธ์๊ฐ ํ๋๋ผ๋ฉด ()
์์ด ์๋์ฒ๋ผ ์จ๋ ๋๋ค.
handleClick = e => {
e.preventDefault()
}
this
this
๊ฐ caller์ bound๋์ง ์๋๋ค. ๐ ๋์ ๊ทธ function์ ๊ฐ์ธ๋ lexical context์ this๋ฅผ ๊ฐ๋ฆฌํจ๋ค.(์ถ์ฒ)์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์์ arrow function์ ์ฐ๋ฉด this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ๊ทธ ๋ฐ๊นฅ ์ค์ฝํ๊ฐ ๋๋ค.
arrow function ์์์ this๋ฅผ ์ฌ์ฉํ์ ๋: this๋ arrow function์ด ์๋๋ผ enclosing lexical context์ธ window
๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
/* arrow function */
const button = document.querySelector('button')
button.addEventListener('click', () => {
console.log(this) // window
this.classList.toggle('on') // ์ฌ๊ธฐ์ this๋ window ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ณ , button์ ์ํ๋ ๋๋ก ์๋ํ์ง ์๋๋ค.
})
function ํค์๋๋ฅผ ์ฐ๋ฉด ์ํ๋ button์ this ๋ฐ์ธ๋ฉ์ด ๋๋ค.
/* refactor with function keyword */
const button = document.querySelector('button')
button.addEventListener('click', function() {
this.classList.toggle('on') // ์ฌ๊ธฐ์ this๋ button์ ๊ฐ๋ฆฌํจ๋ค.
})
.bind(this)
in Reactwindow
๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.class MyComponent extends React.Component {
handleClick() {
console.log(this) // window
this.setState({ open: false }) // ์ ๋๋ก ์คํ๋์ง ์๋๋ค.
}
render() {
return (
<button onClick={this.handleClick}/> // handleClick()์ MyComponent์ ๋ฉ์๋์ด์ง๋ง, this๋ MyComponent๊ฐ ์๋๋ผ undefined๊ฐ ๋๋ค.
)
}
}
class MyComponent extends React.Component {
state = { open: false }
handleClick = () => { // arrow function์์๋ this์ ๋งฅ๋ฝ์ด ์ด๋ฅผ ๊ฐ์ธ๋ ์ปจํ
์คํธ์ด๋ค.
console.log(this) // MyComponent
this.setState({ open: false })
}
render() {
return (
<button onClick={this.handleClick}/> // ์ฌ๊ธฐ์ handleClick ์คํ๋ ๋, handleClick์ ๊ฐ์ธ๊ณ ์๋ MyComponent๊ฐ this๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๋ฉ์๋๊ฐ ์ ๋๋ก ์คํ์ด ๋๋ค.
)
}
}