본문 바로가기
반응형
Programming/Javascript

자바스크립트(Javascript) 함수범위와 클로저

by JAMINS 2020. 1. 8.

함수 유효범위와 클로저

기본적으로 자바스크립트는 함수에 대한 유효범위 만 제공.
자바스크립트의 함수의 바디는 전역 유효 범위랑은 다른 지역 유효 범위 상에서 실행됨.

어휘적 유효범위

함수는 동적이라기 보단 어휘적으로 유효 범위가 정해진다.

유효 범위 : 접근할 수 있는 범위를 의미

함수가 실행되는 유효범위가 아니라 정의되어있는 유효범위 안에서 실행됨.
정의될 때, 현재의 유효 범위 체인이 저장된다. 함수 내부 상태 중 일부가 됨.

함수 하나를 선언하면 함수에서 접근할 수 있는 유효범위는 함수를 포함한 객체의 모든 프로퍼티들(전역객체)이다.

함수 내에 중첩된 함수의 경우 이를 포함한 함수, 상위 객체들이 접근할 수 있는 유효범위가 된다.

유효범위체인이 고정되어도 유효 범위 체인 안에 정의된 프로퍼티는 변경될 수 있다.

호출되는 시점에 연결된 모든 것들에 접근할 수 있다.

호출객체

this
arguments 프로퍼티로 초기화 된다.

네임스페이스로서의 호출 객체

클로저로서의 중첩된 함수

중첩된 함수를 허용, 함수를 데이터로 사용할 수 있으며 어휘적 유효 범위를 사용한다는 사실. -> 강력한 결과

var a = xx;
..

function f() {

    function g() {
        ...
    }
    g();
}

f();
  • f() 호출 시 유효 범위 체인 : f() 호출객체 - 전역객체
  • g() 호출 시 유효 범위 체인 : g() 호출객체 - f() 호출객체 - 전역객체

클로저 예시

함수 호출의 경계를 넘어 값을 기억할 수 있는 함수가 필요할 때,
사라지지 않으면서도 private 속성을 지니는 변수를 생성할 수 있다.

Function() 생성자

var f = new Function("x", "y", "return x*y;");

==

function f(x, y) {return x*y;}

익명함수를 생성.

  • 생성자를 사용하면 코드를 동적으로 생성하고 컴파일할 수 있다. eval()과 유사
  • 호출될 때마다 파싱하고 새로운 함수 객체를 생성함.
  • 어휘적 유효범위를 사용하지 않는다. 최상위 레벨의 함수인 것처럼 컴파일된다.

댓글