객체 안에 정의된 함수는 메서드,
함수(결국 객체) 안에 정의된 함수는 클로저..
클로저 사용시 클로저가 포함된 함수에서 정의한 내부 변수가 사용,
다만 내부에서 정의된 함수가 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' 리턴
'Local Oriented > HTML CSS JS' 카테고리의 다른 글
자바스크립트, 진행 중 이벤트 (0) | 2024.12.19 |
---|---|
자바스크립트, # (0) | 2024.12.12 |
자바스크립트, ... (0) | 2024.12.11 |
Axios post 시 파라미터 설정 (스프링 쪽 설정) (0) | 2023.10.16 |
input file accept 와 사진/동영상/안드로이드 (0) | 2022.11.18 |