본문 바로가기

Local Oriented/HTML CSS JS

자바스크립트, ()() (())

객체 안에 정의된 함수는 메서드,

함수(결국 객체) 안에 정의된 함수는 클로저..

클로저 사용시 클로저가 포함된 함수에서 정의한 내부 변수가 사용,

다만 내부에서 정의된 함수가 new Function() 인 경우 외부 변수가 사용.

 

const baz = 'Global const'; // let 이라도 동일 적용


function foo() {
    const baz = 'Local const';
    function f() { return baz; }
    return f();
}
console.log('foo: ', foo()); // foo() 를 실행, foo 의 body 에서 return f()

// f() 는 return baz

// 결국 foo() 실행시, foo 의 body 에 기술된 f() 메소드가 'Local const' 리턴

function bar() {
    const baz = 'Local const';
    function f() { return baz; }
    return f;
}
console.log('bar: ', bar()()); // bar()() 를 실행, bar() 의 body 에서 return f

// bar()() 가 f() 로 변경되는데, f 는 bar().f() 의 주소이고 return baz

// 결국 bar()() 실행시, bar().f() 메소드가 'Local const' 리턴

// bar() 함수 밖에서 f() 가 실행되지만,

// f() 가 할당될 때의 baz 는 bar() 함수 안에 정의된 const baz.

// 클로저는, 자신을 정의한 함수의 로컬 변수와 매개 변수를 적용

 

const baz = ...; // 외부

const foo = (function() { // 함수를 괄호로 둘러 싸면..

                                 // 함수를 전달하는 것이 아니라, 함수를 실행해서 전달

  const baz = ...; // 내부

  return function() { return baz; }; // const foo 에 전달되는 것은 이곳의 function body

}()); // 즉시 호출되는 함수 표현식

foo(); // 함수 내부의 function() 이 실행되어, 내부의 baz 가 리턴

 

function foo() {

  const vrb;

  return {

    bar: function() { ... }, // bar() { ... } 로 단축 가능

    baz: function() { ... }, // baz() { ... }

  }

}

const a = foo();

const b = foo();

생성된 직후에는 a.vrb === b.vrb 이지만,

이후 함수 호출관계에 의해, 서로 다른 값을 가질 수 있음. (서로 다른 인스턴스..?)

 

function foo(param1) {

  return { // get 과 set 의 함수명은 동일. 일종의 override

    get bar() { ... param1 ... }, // getter 함수. foo(param1) 으로 주입된 param1

    set bar(param2) { ... param1 = param2 ... } // setter 함수. 클로저를 통해 param1 변경

  };

}

// getter 호출시 'setter 로 설정한 값' 을 리턴

 

const bar = 'Global';

function foo() {

  const bar = 'Local';

  return new Function('return bar');

}

foo()(); // Function 은 호출하는 곳의 scope 적용되어 'Global' 리턴