내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것
외부함수가 return문으로 인해 함수가 종료되어도 내부함수가 외부함수의 변수에 접근 할 수 있음을 의미
동일한 외부함수 안에서 만들어진 내부함수나 메소드는 외부함수의 지역변수를 공유
외부함수가 실행될 때마다 새로운 지역변수를 포함하는 클로저가 생성되므로 독립된 객체가 가능
외부함수의 지역변수는 객체의 메소드에서만 접근할 수 잇는 값으로 지역변수를 읽고 수정할 수 있는 것은 메소드를 통해서 만들어진 객체 뿐이다.
현재로는 이러한 개념이 있는 정도로 알고, 큰 프로젝트나 협업 시 꼭 필요하고 알아야 할 내용임을 알자!
함수 안에서 사용할 수 있도록 그 이름이나 특성이 약속되어 있는 일종의 배열
유사 배열이고 즉, arguments 객체의 인스턴스로
이 배열에는 함수를 호출할 때 입력한 인자가 담겨있다.
arguments라는 유사 배열을 이용해 함수의 정의부분에 매개변수가 없어도 인자를 전달할 수 있다.
일반적인 함수를 호출하는 방법
function func() {
}
func();
함수 func는 Function이라는 객체의 인스턴스이므로
func는 객체 Function이 가지고 있는 메소드들을 상속하고 있음
그 중 내장 메소드 apply
를 이용해 함수를 호출할 수 있다.
문법 => func.apply(context, arguments)
첫번째 인자 context: 함수가 실행될 맥락
두번째 인자 arguments: 유사배열객체에 담겨있는 원소가 함수의 인자로 순차적으로 대입
function sum(arg1, arg2){ // arg1 <- 1, arg2 <- 2
return arg1 + arg2;
}
alert(sum.apply(null, [1,2]));
첫번째 인자가 null일 때 apply를 사용하는 것은 효율적이지 않음
(apply가 실행된 함수 인스턴스는 전역객체를 맥락으로 실행됨)
func이라는 함수가 호출되는 그 시점에서 함수의 'this' 값을 프로그래밍적으로 변경해서
마치 func 함수가 인자에 들어가는 값인 객체의 속성인 것처럼 실행되게 할 수 있음
JavaScript에서 함수는 독립적인 객체로서 존재하고, apply 메소드를 통해서 다른 객체의 소유물인 것처럼 실행할 수 있다.