화살표 함수는 function 키워드를 화살표로 축약해서 표시하는 방법이다. ES6부터 새로 도입되었다.
const add = (x, y) => {
return x + y
}
위와 같이 작성된 것을 화살표 함수라고 부르는데, 함수 표현식과 비교하면 한 눈에 확인할 수 있다.
함수 표현식
const add = function(x, y) { return x + y }
화살표 함수
const add = (x, y) => { return x + y }
화살표 함수는 function 키워드를 화살표로 축약하는데, 몇가지 규칙이 있다.
const add = (x, y) => x + y // 정상 작동
const add = (x, y) => {x + y} // undefined. 중괄호를 생략해야 한다
가독성 측면에서도 명시적으로 사용한 것이 더 좋다
// bad
const getAvg = arr => arr.filter(person => person.job === 'student').reduce((sum, person) => (sum + person.grade), 0)
// good
const getAvg = arr => {
return arr
.filter(person => person.job === 'student')
.reduce((sum, person) => (sum + person.grade), 0)
}
화살표 함수는 클로저를 표현할 때 더욱 강력하다.
함수 표현식
const adder = function(x) { return function(y) { return x + y } } adder(5)(7) // 12
function 키워드 제거
const adder = (x) => { return (y) => { return x + y } }
return 생략
// 주의 : return 생략시에는 중괄호를 사용하지 않는다 // 파라미터가 1개라면 소괄호를 생략할 수 있다. const adder = x => { return y => x + y }
최종 축약형
const adder = x => y => x + y
브라우저와 다르게 node.js
의 특징 중 하나는 다양한 내장 모듈이 존재한다는 것이다.
브라우저에서는 다른 스크립트 파일을 불러올 때 html
의 <script>
태그를 이용했다.
반면, node.js
에서는 html
이 존재하지 않기 때문에 JS파일에서 다른 스크립트 파일이나 모듈을 사용하려면 다르게 접근해야 한다.
npm install
을 이용하면 필요한 모듈을 다운로드 받아 사용할 수 있고, 모듈이 node_modules
에 저장되어 있다면 아래처럼 불러올 수 있다.
const 모듈이_담긴_변수 = require('모듈이름')
이제 변수에 모듈이 담겨 있게 된다.
다른 스크립트를 불러오기 위해 require
구문을 사용할 수 있다.
결국 모듈이라는 것도 다른 스크립트라는 것을 상기해야 한다.
우리가 서로 다른 스크립트를 직접 만들었다고 했을 때,
동일한 디렉토리에 다른 두 개의 파일이 있는 경우를 가정하면 아래와 같이 불러올 수 있다.
// script1.js
const module2 = require('./script2.js') // ./는 현재 디렉토리이다.
// script2.js
console.log('this is module 2');
위 예시에서 script1.js
파일이 require
구문을 이용하여 모듈을 불러올 때, script2.js
에 담긴 내용이 실행되는 것을 추측할 수 있는데, 이 모든 과정을 담을 변수 module2
에는 어떤 값이 들어가게 되는 것인지 알기 어렵다.
이 때에는 module.exports
라는 것을 이용한다. 다른 스크립트 파일에서 내가 만든 모듈을 사용할 수 있도록 노출시키는 방법이다.
// script1.js
const module2 = require('./script2.js')
console.log(modules2) // 'this is module 2'
// script2.js
module.exports = 'this is module 2'
module.export
를 축약하여 exports
로 사용할 수 있다. (축약형)
이와 같은 모듈 노출 방법과 불러오는 방법을 CommonJS 모듈 시스템이라고 부른다.
주의사항
module.exports.anything
과exports.anything
은 같은 역할을 하는 게 맞는데,
module.exports = { a: 1 }
과exports = { a: 1 }
은 전혀 다른 결과가 나온다.
exports
는module.exports
를 참조할 뿐이기 때문에, 직접 무언가를 할당하게 되면 정상적으로 작동하지 않는다.
그리고module.exports
에 이미 무언가 붙어 있는 상태라면,exports
는 무시된다 (섞어 쓰면 안된다)
쉽게 말하자면,module.exports
와exports
는 서로 재할당이 가능하기 때문에 주의해야 한다.