function printValue() {
return value;
}
function printFunc(func) {
var value = "value2";
console.log(func());
}
printFunc(printValue);
이거 실행결과가 value1 인데.. 도통 왜 그런지 모르겠다.
1. printFunc 가 실행되면서 실행 컨텍스트가 하나 생김, (하지만 printValue는 아직 실행되지 않은 거지?)
2. printFunc 내에서 printValue가 실행되면서 또 하나 생김 ( 이 때 printValue 실행 컨텍스트가 생기는거 아님? )
그럼 당연히 상위 컨텍스트의 스코프 체인을 참조하면서 value2가 찍혀야 되는데 내가 말한 가정이 아니라면
1 번에서 printValue가 실행 된다는건가? 알려죠..
클로저 예제냐. 렉시컬 스코프가 몬지 아냐? 클로저는 바로 선언된 시점의 스코프를 사용한다. 실행시점의 스코프는 아웃오브안중. printValue 함수 선언시점에 value는 글로벌 멤버인 value = "value1"이고 이 참조를 클로저로써 유지한다. 때문에 실행시점에 value = "value2"라고 했어도 렉시컬 스코프를 쓰기 때문에 선언시점의 value를쓴다.
니가말한대로 되려면 pv함수를 pf안에서 선언해야함
위에 게이가 말한거처럼 캡처된 변수는 동적스코핑이 아님
음~~일단 스코프 체이닝 예제이긴한데 .. "선언된 시점의 스코프를 사용한다. 실행시점의 스코프는 아웃오브안중"이 핵심이구만..
이제야 좀 이해가 됌 감사 ㅋㅋ..
렉시컬 특성이란 함수 실행 시 유효범위를 함수 실행 환경이 아닌 함수 정의 환경으로 참조하는 특성입니다. 라고 나오네.. 샹 이걸 왜 주의깊게 못 읽고 지나쳤지..
노오오력해라
C는 어때요?
C에 람다식이 어딨노
전역변수랑 지역변수, 함수 얘긴줄..
근데 왜 Lexical 이지? 무슨 의미가 담긴 단어임??
컴파일러에 나오던데
저 코드가 람다식을 이용한 코드인가요?
람다가 뭔진 모르지만 람다식으로 구현한게 클로저라고 위키에 써있네요
C에선 실행코드 안에서 함수정의가 안되지 JS는 함수가 람다식이라 문제없고
var value = "value1"; function printValue() { return value; }
선언된 시점의 스코프를 사용한다.