실행 컨텍스트가 형성 되는 경우
현재 실행되는 컨텍스트에서 이 컨텍스트와 관련 없는 실행 코드가 실행되면, 새로운 컨텍스트가 생성되어 스택에 들어가고 제어권이 그 컨텍스트로 이동한다.
console.log("1");
function func1(){
console.log("2");
}
function func2(){
console.log("3");
}
func2();
실행 컨텍스트가 생성되면 자바스크립트 엔진은 해당 컨텍스트에서 실행에 필요한 여러 가지 정보를 담을 객체를 생성한다. -> 변수, 매개변수, 객체 ...
화살표 함수는 익숙해지면 더욱 빠르고 편리하게 함수를 만들 수 있다!
본문이 한 줄인 함수를 작성할 때 유용하고,
여러 줄인 경우 다른 방법으로 화살표 함수를 작성한다.
let func = function(arg1, arg2, ...argN) {
return expression;
};
// 함수 func는 화살표(=>) 우측의 표현식(expression)을 평가하고, 평가 결과를 반환
let func = (arg1, arg2, ...argN) => expression
//본문이 여러 줄인 경우 -> 중괄호 사용
(...args) => { body } // 중괄호와 return 지시자를 사용해 반환 값을 명기
Rest Operator(나머지 매개변수)는 나머지 후속 매개변수들을 묶어 하나의 배열에 저장해서 사용하는 것이다. 묶어줄 매개변수 앞에 ...을 붙여서 작성하면 된다.
즉, Rest Operator는 배열과 함수의 인자 중 나머지를 가리키며, 객체의 나머지 필드를 가리킨다.
// args에 1,2,3,4,5가 한꺼번에 배열로 담겨 인자로 넘겨진다.
function func1(...args) {
console.log(`args: [${args}]`)
// args: [1,2,3,4,5]
}
func1(1,2,3,4,5);
// arg1에는 1, arg2에는 2, arg3에는 나머지 3,4,5가 배열로 담겨 인자로 넘겨진다.
function func2(arg1, arg2, ...arg3) {
console.log(`arg1: ${arg1}, arg2: ${arg2}, arg3: [${arg3}]`)
// arg1: 1, arg2: 2, arg3: [3,4,5]
}
func2(1,2,3,4,5);
func(인자1, 인자2, ...인자들)로 넘겨주게 되면 인자1, 인자2처럼 지정된 인자는 앞에서부터 각각의 값을 넣어주고 그 뒤의 나머지 후속 인자들을 배열에 인자들로 묶어서 보내주는 것이다.
Rest Operator는 함수 정의에는 하나의 ...만 존재할 수 있으며, 반드시 마지막 매개변수여야 한다.
func(...wrong, arg2, arg3)
// 틀린 예. ...wrong이 마지막으로 와야 한
Spread Operator(전개 구문)는 묶인 배열 혹은 객체를 개별적인 요소로 분리한다. 즉, Rest와 반대 개념이라고 생각하면 되고, 마찬가지로 전개할 매개변수 앞에 ...을 붙여서 작성하면 된다.
따라서, 배열과 함수에선 또 다른 배열과 함수의 인자로의 전개를, 객체에선 또 다른 객체로의 전개를 한다.
let arr = [1, 2, 3, 4, 5];
console.log(...arr);
// 1 2 3 4 5
var str = 'javascript';
console.log(...str);
// "j" "a" "v" "a" "s" "c" "r" "i" "p" "t"
Spread Operator도 Rest Operator와 마찬가지로 ...의 작성 순서에 주의해야 한다. 등장 순서에 따라, 덮어씌워 질 수 있기 때문이다.
var obj = { name: '짱구', species: 'human'};
obj = { ...obj, age: 5};
console.log(obj)
// {name: "짱구", species: "human", age: 5}
obj = { ...obj, name: '짱아', age: 1};
console.log(obj);
// {name: "짱아", species: "human", age: 11}
위 예제와 같이 ...obj가 먼저 나오고 name과 age가 나중에 등장함으로써 덮어씌워져 값이 변경된 것을 확인할 수 있다.
요약하자면, Rest Operator(나머지 매개변수)는 배열로 묶는 역할을,
Spread Operator(전개 구문)는 개별적인 요소로 분리하는 역할을 한다.
둘 다 "..." 을 붙여서 사용하며, 작성 순서에 주의해야 한다.