SlideShare uma empresa Scribd logo
1 de 23
스파르탄 스터디
CH.03. Execution context & Closure
1. 개요
2. Execution Context
3. Lexical Environment
4. Variable Environment, This Binding
5. Declaration Binding Instantiation
6. Closure
Execution context
실행 가능 코드(Executable Code)
1. Global code
2. eval code
3. Function code
를 만났을 때, Execution context가 하나씩 생성
이 때, 세 가지 Components를 생성
1. LexicalEnvironment
2. VariableEnvironment
3. ThisBinding
=> Running execution context이 대상
1. 개요
running execution context
2. Execution Context
=> the top of the execution context stack
Execution Contexts
=> Executable Code(global, function, eval)의 개수만큼
Execution Context가 생성된다.
2. Execution Context
함수가 실행될때,
ExecutionContext(3개의
Component로 구성) 생성
ExecutionContexts = {
LexicalEnvironment : {}
, VariableEnvironment : {}
, ThisBinding : {}
}
debugger;
var sayHello = 'Hello, ';
function person(){
var first = 'David',
last = 'Shariff';
function firstName(){
return first;
}
function lastName(){
return last;
}
console.log(sayhello + firstName() + ' ' + lastName());
}
person();
2. Execution Context
Lexical Environment
=> 자바스크립트 코드의 실행환경, 범위를 구조적으로 엮으면서 독립
적으로 실행하기 위한 환경
LexicalEnvironment = {
EnvironmentRecords : {} // 실행 중인 함수 안의 함수, 변수 저장
, outerEnvironmentRecords : {} // 가장 근접한 스코프
}
3. Lexical Environment
firstName()이 실행중이라면,
outerEnvironmentRecords는
person()의 EnvironmentRecords
가 된다
Environment Records
=> 함수와 변수를 기록하는 곳
EnvironmentRecords : {
DeclarativeEnvironmentRecord : {}
, ObjectEnvironmentRecord : {}
}
DeclarativeEnvironmentRecord : function, 변수, catch 문
ObjectEnvironmentRecord : binding object의 function, 변수, with 문
person()이 실행중이라면,
DeclarativeEnvironmentRecord
에는 first, last, firstName,
lastName이 binding
ObjectEnvironmentRecord 에는
sayHello이 binding
3. Lexical Environment
VariableEnvironment
=> LexicalEnvironment 와 같지만 다르다?
4. Variable Environment, This Binding
function, 변수 식별자(Identifier)이 binding 되
는 점은 같다.
LexicalEnvironment의 값은 실행 중에 변하지만,
VariableEnvironment는 변하지 않는다.
ThisBinding
2번째 시간에 배웠던 호출한 함수가 속한 오브
젝트를 참조한다는 기본원리와 동일
VariableEnvironment
=> LexicalEnvironment 와 같지만 다르다?
4. Variable Environment, This Binding
function, 변수 식별자(Identifier)이 binding 되
는 점은 같다.
LexicalEnvironment의 값은 실행 중에 변하지만,
VariableEnvironment는 변하지 않는다.
ThisBinding
2번째 시간에 배웠던 호출한 함수가 속한 오브
젝트를 참조한다는 기본원리와 동일
ExecutionContext 정리
ExecutionContext = {
LexicalEnvironment : {
EnvironmentRecords : { // 실행 중인 함수 안의 함수, 변수 저장
DeclarativeEnvironmentRecord : {} // function, 변수, catch 문
, ObjectEnvironmentRecord : {} // 글로벌 오브젝트의 function, 변수, with문
}
, outerEnvironmentRecords : {} // 가장 근접한 스코프
}
, VariableEnvironment : {} // function, 변수 식별자(Identifier)가 binding
, ThisBinding : {} // 호출한 함수가 속한 오브젝트를 참조
}
좋은 코딩 방식 = outerEnvironmentRecords 참조의 최
소화
1. 함수에서 사용할 함수, 변수를 함수 안에 작성
2. 어렵다면 한 단계 위의 Scope에 작성
3. 전역 변수사용 최소화
3. Lexical Environment
Declaration Binding Instantiation
모든 Execution context는 선언된 function, 변수를
VariableEnvironment의 Environment Record에 바인딩 한다.
특별히 function은 parameter 또한 바인딩 한다.
5. Declaration Binding Instantiation
debugger;
var sayHello = 'Hello, ';
function person(){
var first = 'David', last = 'Shariff';
function firstName(){
return first;
}
function lastName(){
return last;
}
console.log(sayhello + firstName() + ' ' + lastName());
}
person();
Declaration Binding Instantiation
Quiz.
debugger;
var obj = {};
obj.sports = function(one, two, two){
console.log(one + two);
}
obj.sports(11, 22, 33);
5. Declaration Binding Instantiation
모든 파라미터가 순차적으로 binding
Declaration Binding Instantiation
Quiz.
debugger;
var obj = {};
obj.sports = function(one, two, two){
console.log(one + two);
}
obj.sports(11, 22, 33);
5. Declaration Binding Instantiation
모든 파라미터가 순차적으로 binding
Declaration Binding Instantiation
Quiz.
debugger;
var obj = {};
obj.sports = function(one, two, two){
console.log(one + two);
function one(){};
}
obj.sports(11, 22, 33);
5. Declaration Binding Instantiation
FunctionDeclaration을 모두 찾아서 binding
Declaration Binding Instantiation
Quiz.
debugger;
var obj = {};
obj.sports = function(one, two, arguments){
console.log(arguments); // ?
}
obj.sports(11, 22, 33);
5. Declaration Binding Instantiation
DeclarativeEnvironmentRecord에 이미 존재하는 것들은
설정하지 않는다.
Declaration Binding Instantiation
Quiz.
debugger;
var obj = {};
obj.sports = function(one, two, arguments){
console.log(arguments); // ?
}
obj.sports(11, 22, 33);
5. Declaration Binding Instantiation
DeclarativeEnvironmentRecord에 이미 존재하는 것들은
설정하지 않는다.
Closure – Closure를 사용하지 않았을 때
var uniqueId = function(){
if(!arguments.callee.id){
arguments.callee.id = 0;
}
return arguments.callee.id++;
}
uniqueId(); // 0
uniqueId(); // 1
uniqueId(); // 2
// id를 0으로 초기화 할 수 있을까?
6. Closure
Closure – Closure를 사용하지 않았을 때
var uniqueId = function(){
if(!arguments.callee.id){
arguments.callee.id = 0;
}
return arguments.callee.id++;
}
uniqueId(); // 0
uniqueId(); // 1
uniqueId(); // 2
// id를 0으로 초기화 할 수 있을까?
uniqueId.id = 0;
uniqueId(); // 0
6. Closure
Closure – Closure를 사용했을 때
var uniqueId = (function(){
var id = 0;
return function(){
return id++;
}
})();
uniqueId(); // 0
uniqueId(); // 1
uniqueId(); // 2
// id를 0으로 초기화 할 수 있을까?
6. Closure
var uniqueId = (function(){
var id = 0;
return function(){
return id++;
}
})();
uniqueId(); // 0
uniqueId(); // 1
uniqueId(); // 2
// 0으로 초기화
uniqueId.id = 0 // ?
6. Closure
Closure – Closure를 사용했을 때
선언되어 있는
id에는 접근할
수 없다
=> Closure를 통해 모듈화를 할 수 있다.
Closure
6. Closure
- 생명주기가 끝난 변수(id)가 계속 참조 가능한 이유 :
중첩된 함수에 대한 참조가 전역 유효범위(uniqueId) 안에 저장되
어 있기 때문
- 전제 조건 :
바깥 함수(uniqueId)의 반환값으로 중첩된 함수(return의 함수)를
사용하거나 중첩된 함수를 객체의 프로퍼티로 저장
var uniqueId = (function(){
var id = 0;
return function(){
return id++;
}
})();
참고자료
- http://www.ecma-international.org/ecma-262/5.1/#sec-10
- http://davidshariff.com/blog/what-is-the-execution-
context-in-javascript/
- 몰입! 자바스크립트 김영보
- 자바스크립트 완벽 가이드 데이비드 플래너건
* 참고사항 : 이 자료는 함수와 관련된 Execution Context와 그 하위 사항만을
다루고 있습니다. global, eval 코드의 실행과 그와 관련된 사항, strict 모드, try
catch문에서의 처리 등등에 관해서는 위의 링크를 참고하시기 바랍니다.

Mais conteúdo relacionado

Mais procurados

Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
Javascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorJavascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorYoung-Beom Rhee
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Circulus
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자Circulus
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Circulus
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.Young-Beom Rhee
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsSeok-joon Yun
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Park Jonggun
 

Mais procurados (20)

Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
Javascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorJavascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operator
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threads
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
 
Javascript
JavascriptJavascript
Javascript
 

Semelhante a Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical Environment

Javascript Closure
Javascript ClosureJavascript Closure
Javascript Closure지수 윤
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 Chanwook Park
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작Taegon Kim
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
03 realm 쓰기 & 질의
03   realm 쓰기 & 질의03   realm 쓰기 & 질의
03 realm 쓰기 & 질의Lee-Jong-Chan
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장tedypicker
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
[JS] Function.prototype.bind
[JS] Function.prototype.bind[JS] Function.prototype.bind
[JS] Function.prototype.bindJinhyuck Kim
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발지수 윤
 

Semelhante a Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical Environment (20)

Javascript Closure
Javascript ClosureJavascript Closure
Javascript Closure
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기 스프링처럼 JDBC 리팩터링하기
스프링처럼 JDBC 리팩터링하기
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
 
Eclipse RCP 1/2
Eclipse RCP 1/2Eclipse RCP 1/2
Eclipse RCP 1/2
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
03 realm 쓰기 & 질의
03   realm 쓰기 & 질의03   realm 쓰기 & 질의
03 realm 쓰기 & 질의
 
Java script
Java scriptJava script
Java script
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
[JS] Function.prototype.bind
[JS] Function.prototype.bind[JS] Function.prototype.bind
[JS] Function.prototype.bind
 
javascript01
javascript01javascript01
javascript01
 
2. 엔티티 매핑(entity mapping) 2 3 롬복(lombok)소개-1
2. 엔티티 매핑(entity mapping) 2 3 롬복(lombok)소개-12. 엔티티 매핑(entity mapping) 2 3 롬복(lombok)소개-1
2. 엔티티 매핑(entity mapping) 2 3 롬복(lombok)소개-1
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발
 

Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical Environment

  • 2. 1. 개요 2. Execution Context 3. Lexical Environment 4. Variable Environment, This Binding 5. Declaration Binding Instantiation 6. Closure
  • 3. Execution context 실행 가능 코드(Executable Code) 1. Global code 2. eval code 3. Function code 를 만났을 때, Execution context가 하나씩 생성 이 때, 세 가지 Components를 생성 1. LexicalEnvironment 2. VariableEnvironment 3. ThisBinding => Running execution context이 대상 1. 개요
  • 4. running execution context 2. Execution Context => the top of the execution context stack
  • 5. Execution Contexts => Executable Code(global, function, eval)의 개수만큼 Execution Context가 생성된다. 2. Execution Context
  • 6. 함수가 실행될때, ExecutionContext(3개의 Component로 구성) 생성 ExecutionContexts = { LexicalEnvironment : {} , VariableEnvironment : {} , ThisBinding : {} } debugger; var sayHello = 'Hello, '; function person(){ var first = 'David', last = 'Shariff'; function firstName(){ return first; } function lastName(){ return last; } console.log(sayhello + firstName() + ' ' + lastName()); } person(); 2. Execution Context
  • 7. Lexical Environment => 자바스크립트 코드의 실행환경, 범위를 구조적으로 엮으면서 독립 적으로 실행하기 위한 환경 LexicalEnvironment = { EnvironmentRecords : {} // 실행 중인 함수 안의 함수, 변수 저장 , outerEnvironmentRecords : {} // 가장 근접한 스코프 } 3. Lexical Environment firstName()이 실행중이라면, outerEnvironmentRecords는 person()의 EnvironmentRecords 가 된다
  • 8. Environment Records => 함수와 변수를 기록하는 곳 EnvironmentRecords : { DeclarativeEnvironmentRecord : {} , ObjectEnvironmentRecord : {} } DeclarativeEnvironmentRecord : function, 변수, catch 문 ObjectEnvironmentRecord : binding object의 function, 변수, with 문 person()이 실행중이라면, DeclarativeEnvironmentRecord 에는 first, last, firstName, lastName이 binding ObjectEnvironmentRecord 에는 sayHello이 binding 3. Lexical Environment
  • 9. VariableEnvironment => LexicalEnvironment 와 같지만 다르다? 4. Variable Environment, This Binding function, 변수 식별자(Identifier)이 binding 되 는 점은 같다. LexicalEnvironment의 값은 실행 중에 변하지만, VariableEnvironment는 변하지 않는다. ThisBinding 2번째 시간에 배웠던 호출한 함수가 속한 오브 젝트를 참조한다는 기본원리와 동일
  • 10. VariableEnvironment => LexicalEnvironment 와 같지만 다르다? 4. Variable Environment, This Binding function, 변수 식별자(Identifier)이 binding 되 는 점은 같다. LexicalEnvironment의 값은 실행 중에 변하지만, VariableEnvironment는 변하지 않는다. ThisBinding 2번째 시간에 배웠던 호출한 함수가 속한 오브 젝트를 참조한다는 기본원리와 동일
  • 11. ExecutionContext 정리 ExecutionContext = { LexicalEnvironment : { EnvironmentRecords : { // 실행 중인 함수 안의 함수, 변수 저장 DeclarativeEnvironmentRecord : {} // function, 변수, catch 문 , ObjectEnvironmentRecord : {} // 글로벌 오브젝트의 function, 변수, with문 } , outerEnvironmentRecords : {} // 가장 근접한 스코프 } , VariableEnvironment : {} // function, 변수 식별자(Identifier)가 binding , ThisBinding : {} // 호출한 함수가 속한 오브젝트를 참조 } 좋은 코딩 방식 = outerEnvironmentRecords 참조의 최 소화 1. 함수에서 사용할 함수, 변수를 함수 안에 작성 2. 어렵다면 한 단계 위의 Scope에 작성 3. 전역 변수사용 최소화 3. Lexical Environment
  • 12. Declaration Binding Instantiation 모든 Execution context는 선언된 function, 변수를 VariableEnvironment의 Environment Record에 바인딩 한다. 특별히 function은 parameter 또한 바인딩 한다. 5. Declaration Binding Instantiation debugger; var sayHello = 'Hello, '; function person(){ var first = 'David', last = 'Shariff'; function firstName(){ return first; } function lastName(){ return last; } console.log(sayhello + firstName() + ' ' + lastName()); } person();
  • 13. Declaration Binding Instantiation Quiz. debugger; var obj = {}; obj.sports = function(one, two, two){ console.log(one + two); } obj.sports(11, 22, 33); 5. Declaration Binding Instantiation 모든 파라미터가 순차적으로 binding
  • 14. Declaration Binding Instantiation Quiz. debugger; var obj = {}; obj.sports = function(one, two, two){ console.log(one + two); } obj.sports(11, 22, 33); 5. Declaration Binding Instantiation 모든 파라미터가 순차적으로 binding
  • 15. Declaration Binding Instantiation Quiz. debugger; var obj = {}; obj.sports = function(one, two, two){ console.log(one + two); function one(){}; } obj.sports(11, 22, 33); 5. Declaration Binding Instantiation FunctionDeclaration을 모두 찾아서 binding
  • 16. Declaration Binding Instantiation Quiz. debugger; var obj = {}; obj.sports = function(one, two, arguments){ console.log(arguments); // ? } obj.sports(11, 22, 33); 5. Declaration Binding Instantiation DeclarativeEnvironmentRecord에 이미 존재하는 것들은 설정하지 않는다.
  • 17. Declaration Binding Instantiation Quiz. debugger; var obj = {}; obj.sports = function(one, two, arguments){ console.log(arguments); // ? } obj.sports(11, 22, 33); 5. Declaration Binding Instantiation DeclarativeEnvironmentRecord에 이미 존재하는 것들은 설정하지 않는다.
  • 18. Closure – Closure를 사용하지 않았을 때 var uniqueId = function(){ if(!arguments.callee.id){ arguments.callee.id = 0; } return arguments.callee.id++; } uniqueId(); // 0 uniqueId(); // 1 uniqueId(); // 2 // id를 0으로 초기화 할 수 있을까? 6. Closure
  • 19. Closure – Closure를 사용하지 않았을 때 var uniqueId = function(){ if(!arguments.callee.id){ arguments.callee.id = 0; } return arguments.callee.id++; } uniqueId(); // 0 uniqueId(); // 1 uniqueId(); // 2 // id를 0으로 초기화 할 수 있을까? uniqueId.id = 0; uniqueId(); // 0 6. Closure
  • 20. Closure – Closure를 사용했을 때 var uniqueId = (function(){ var id = 0; return function(){ return id++; } })(); uniqueId(); // 0 uniqueId(); // 1 uniqueId(); // 2 // id를 0으로 초기화 할 수 있을까? 6. Closure
  • 21. var uniqueId = (function(){ var id = 0; return function(){ return id++; } })(); uniqueId(); // 0 uniqueId(); // 1 uniqueId(); // 2 // 0으로 초기화 uniqueId.id = 0 // ? 6. Closure Closure – Closure를 사용했을 때 선언되어 있는 id에는 접근할 수 없다 => Closure를 통해 모듈화를 할 수 있다.
  • 22. Closure 6. Closure - 생명주기가 끝난 변수(id)가 계속 참조 가능한 이유 : 중첩된 함수에 대한 참조가 전역 유효범위(uniqueId) 안에 저장되 어 있기 때문 - 전제 조건 : 바깥 함수(uniqueId)의 반환값으로 중첩된 함수(return의 함수)를 사용하거나 중첩된 함수를 객체의 프로퍼티로 저장 var uniqueId = (function(){ var id = 0; return function(){ return id++; } })();
  • 23. 참고자료 - http://www.ecma-international.org/ecma-262/5.1/#sec-10 - http://davidshariff.com/blog/what-is-the-execution- context-in-javascript/ - 몰입! 자바스크립트 김영보 - 자바스크립트 완벽 가이드 데이비드 플래너건 * 참고사항 : 이 자료는 함수와 관련된 Execution Context와 그 하위 사항만을 다루고 있습니다. global, eval 코드의 실행과 그와 관련된 사항, strict 모드, try catch문에서의 처리 등등에 관해서는 위의 링크를 참고하시기 바랍니다.