고차 함수
고차 함수(higher order function)는 함수를 인자(argument)로 받거나 함수를 리턴하는 함수를 말합니다.
Callback 함수
이 때 다른 함수(caller)의 인자(argument)로 전달되는 함수를 콜백 함수(callback function)라고 합니다.
커리(Curry) 함수
함수를 리턴하는 함수’만을 일컫는 용어가 따로 존재하고 실제로도 많이 쓰입니다.
이런 함수를 이를 고안해 낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따라 커리 함수라고 합니다.
Hoisting(호이스팅)
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.
자바스크립트 함수는 실행되기 전에 함수 안에 필요한 변수값들을 모두 모아서 유효 범위의 최상단에 선언한다
호이스팅의 대상
var 변수 선언과 함수선언문에서만 호이스팅이 일어난다.
var 변수/함수의 선언만 위로 끌어 올려지며, 할당은 끌어 올려지지 않는다
let/const 변수 선언과 함수표현식에서는 호이스팅이 발생하지 않는다.
이게 무슨 말인가? 우리는 코드를 작성할 때 위에서 부터 차례대로 코드를 작성하고, 코드 또한 위에서부터 차례대로 실행을 한다.
하지만 호이스팅은 중간에 적은 코드들을 제일 위로 올려 작동하게 만드는 것이다.
(실제로 코드가 옮겨지지는 않고 자바스크립트가 그렇게 실행한다는 것)
var / let의 호이스팅 결과 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
hi();
function hi() {
console.log("what is your " + name); // what is your undefined
var name = 'Kogong';
console.log("what is your " + name); // what is your Kogong
}
var은 첫 번째 console.log보다 밑에 있지만, 호이스팅에 의해서 제일 위로 끌어 올려진다.
하지만 할당은 본인의 위치를 지키게 된다.
hi();
function hi() {
console.log("what is your " + name);
let name = 'Kogong';
console.log("what is your " + name);
}
하지만 Let과 const는 호이스팅에서 제외된다. 그래서 위의 console.log의 결과는
Uncaught ReferenceError: Cannot access 'name' before initialization
오류가 뜬다.
함수 선언문 vs 함수 표현식
1
2
3
4
5
6
7
8
9
10
foo();
foo2();
function foo() { // 함수선언문
console.log("hello");
}
var foo2 = function() { // 함수표현식
console.log("hello2");
}
여기서 함수선언문만 호이스팅이 된다. var처럼!
다른 예시
1
2
3
4
5
6
7
8
9
10
11
12
catName("Chloe");
function catName(name) {
console.log("My cat's name is " + name);
}
위 코드의 결과는: "My cat's name is Chloe"
함수 선언은 호이스팅에 의해 catName("Chole")보다 위에 있는 것 처럼
실행됨.
1
2
3
4
5
6
7
catName("Chloe");
let abc = function catName(name) {
console.log("My cat's name is " + name);
}
let은 표현식이기 때문에 코드 결과는
Uncaught ReferenceError: catName is not defined