함수 선언과 함수 표현식Rest 파라미터특별한 변수 arguments매개변수에 기본 값 할당클로저클로저로 인한 문제IIFE(Immediately invoked function expression)
함수 선언과 함수 표현식
var workout = function () {}; // 함수 표현식 function workout() { // 함수 선언 }
Rest 파라미터
- ES6에서 추가된 기능으로 매개변수(parameter) 이름앞에 …을 붙여서 정의한 매개변수를 의미함. Rest 파라미터는 함수에 전달된 인수들의 목록을 배열로 전달받음
function foo(...rest) { console.log(rest); } foo(1, 2, 3, 4, 5); // [1, 2, 3, 4, 5];
특별한 변수 arguments
function f() { return arguments } var args = f('a', 'b', 'c'); args.length // 3 args[0] // 'a'
매개변수에 기본 값 할당
function pair(x=0, y=0) { return [x, y]; }
클로저
모든 함수는 자신이 들어 있는 스코프에 들어 있던 변수와 연결되며, 해당 함수가 그 스코프를 떠나더라도 연결은 유지됨
function createIncrementor(start) { return function() { start ++; return start; } } var inc = createIncrementor(5); inc() // 6 inc() // 7 inc() // 8
- inc에 반환된 함수를 저장했을 때, 해당 함수는 처음에 생성된 콘텍스트를 떠난 것이지만, start와는 계속 연결이 되어 있는 것
클로저로 인한 문제
var result = []; for (var i=0; i< 5; i++) { result.push(function () { return i }); } console.log(result[1]()); // 5 (1 아님) console.log(result[3]()); // 5 (3 아님)
- function에 들어있는 i 의 값은 그 함수를 정의할 때의 값이 아니라, 지금 현재의 i 의 값이기에 항상 5가 반환되게 됨
IIFE(Immediately invoked function expression)
(function () { var tmp = ...; }()); // IIFE (즉시 호출하는 함수 표현식)
for (var i=0; i< 5; i++) { (function () { var i2 = i; result.push(function () { return i2 }); }()); }
- 자바스크립트에서는 블록으로 변수 스코프를 생성할 수 없고 반드시 함수를 써야 함.(새 변수 스코프가 필요할 시)
- 함수를 블록처럼 사용하는 패턴 ⇒ IIFE