SlideShare ist ein Scribd-Unternehmen logo
1 von 34
스파르탄 스터디
CH.02. JS function
1. 기본개념부터 잡아보자
2. 호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
1.기본개념부터 잡아보자
2. 호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
함수
호출되거나 실행될 수 있는 자바스크립트
코드 블록
모듈화의 근간
자바스크립트는 함수형 언어
일급객체(First class citizen)
1. 기본개념
함수 vs. 메서드
console.dir() 은 함수일까? 메서드일까?
function funcA() {
/* 코드 블록*/
}
vs.
var objA = {
funcA : function() {
/* 코드 블록 */
}
}
1. 기본개념
함수 vs. 메서드
함수를 객체의 속성에 저장하는 경우
=> 메서드(method)
console.dir()의 dir역시
console 객체의 하나의 속성
1. 기본개념
내장함수(built-in function)
미리 생성되어 있는 함수들
parseInt(), Math.exp() 등등
1. 기본개념
함수의 종류
FunctionDeclaration vs. FunctionExpression
funcA();
function funcA() {
console.log('funcA has called');
} // 호출됨
* FunctionDeclaration은 Hoisting이 발생한다.
(단, 정식명칭은 아니다.)
1. 기본개념
Quiz.
funcB();
var funcB = function() {
console.log('funcB has called');
}; // 에러
Quiz.
console.log(a);
var a = 1;
var a = function(){};
console.log(a);
1. 기본개념
console.log(a);
var a = 1;
function a() {};
console.log(a);
console.log(a);
function a() {};
var a = 1;
console.log(a);
각각의 출력 결과는?
Quiz.
console.log(a);
var a = 1;
var a = function(){};
console.log(a);
// undefined
// function (){}
1. 기본개념
console.log(a);
var a = 1;
function a() {};
console.log(a);
// function a() {}
// 1
console.log(a);
function a() {};
var a = 1;
console.log(a);
// function a() {}
// 1
그 외의 함수들
즉시실행함수
(function(){
console.log("Right now!")
})();
1. 기본개념
중첩된 함수 혹은 내부함수
function a() {
function b() {
}
}
=> closure
함수 전달인자 - arguments
function maxNum(/* 어떤 값이 들어와도 상관 없음 */) {
var max = Number.NEGATIVE_INFINITY;
for(var idx in arguments) {
if(!isNaN(arguments[idx]) && arguments[idx]>max) {
max = Number(arguments[idx]);
}
}
return max;
}
maxNum(1, 21, 3, undefined, 5, 123, false, '1234', 'test');
=> 가변전달인자 varargs(variable length
arguments)
1. 기본개념
Arguments 객체
- 함수 내부에 존재하는 객체
function dirArgu(/*파라미터 선언 없음*/) {
console.dir(arguments);
}
dirArgu(1);
dirArgu(1,2,3,4,5,6,7);
1. 기본개념
1. 기본개념부터 잡아보자
2.호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
호출패턴과 this
1. 메서드 호출 패턴
- 호출하는 패턴에 따라 this라는 추가적인 매개변수를 다르게
초기화 한다.
var objA = {
sum : 0
, add : function(addVal) {
this.sum += addVal;
return this.sum;
}
}
objA.sum;
objA.add(2);
objA.add(3);
var directAddCall = objA.add;
directAddCall(2);
this === objA
2. 호출패턴에 따라 달라지는 this
this === window
★ This -> 호출한 함수가 속
한 오브젝트를 참조
2. 함수 호출
function funcA() {
console.dir(this);
};
console.dir(funcA());
2. 호출패턴에 따라 달라지는 this
this === window
function funcA() {
"use strict";
console.dir(this);
};
funcA();
window.funcA();
this === undefined
this === window
3. 생성자 호출
function FuncA() {};
var funcB = new FuncA();
FuncA.prototype.checkThis
= function(){
console.dir(this);
};
funcB.checkThis();
2. 호출패턴에 따라 달라지는 this
this === FuncA
4. call 과 apply
function A(a,b,c) {
console.log(this.x, this.y, a, b, c);
}
A();
A.call({x:1,y:2});
A.apply({x:1,y:2},[3,4,5]);
명시적으로 this에
mapping시킬
프로퍼티들을 넘길 수 있다
2. 호출패턴에 따라 달라지는 this
+ bind를 통한 this mapping
var newA = A.bind({x:3,y:4})
var newA2 = A.bind({x:3,y:4,a:5})
2. 호출패턴에 따라 달라지는 this
call, apply
-> 호출시점에 일시적인 매핑
bind
-> 영구적인 Binding
1. 기본개념부터 잡아보자
2. 호출패턴에 따라 달라지는 this
3.상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수
함수의 프로토타입 상속
function FuncA() {}
var funcA1 = new FuncA();
console.dir(funcA1);
FuncA.prototype.addedMethod =
function(){ console.log("I'm added"); };
console.dir(funcA1);
3. 상속을 가능하게 해주는 Prototype
=> __proto__ 는 생성자의 prototype을 바라보고 있다.
* prototype chaining 맛보기
var a = {
func : function(){ console.log(this.val); }
};
var b = Object.create(a);
var c = Object.create(b);
var d = Object.create(c);
var e = Object.create(d);
b.val = 'b.val';
a.val = ‘a.val‘;
e.func(); // b.val
e .__proto__ .__proto__ .__proto__ .__proto__ === a; // true
3. 상속을 가능하게 해주는 Prototype
1. 기본개념부터 잡아보자
2. 호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
Quiz.
function aa() {
var a = 1;
function b() {
var a = 2;
c();
}
function c() {
console.log(a);
}
b();
}
aa();
a = ?
4. 다른 언어와 다른 유효범위 Scope
Quiz. 항목별 유효범위
4. 다른 언어와 다른 유효범위 Scope
function outer() {
debugger;
inner();
var a = 1;
function inner() {
var x = 2;
}
var b = 2;
if(a==1) {
var c = 3;
}
console.log(c);
}
outer();
항목별 Scope는
어떻게 될까?
outer()
inner()
x, a, b, c
항목별 유효범위
Scope 결정요소 :
어디에
선언되었느냐?
변수냐? 함수냐?
4. 다른 언어와 다른 유효범위 Scope
function outer() {
debugger;
inner();
var a = 1;
function inner() {
var x = 2;
}
var b = 2;
if(a==1) {
var c = 3;
}
console.log(c);
}
outer();
항목별 Scope : (순서대로)
outer(), inner(), x, a, b, c
!! If 블록을
넘어간다.
* JavaScript의 Scope는
블록단위가 아니라 함수 단위
블록 vs. 함수 유효범위
C, Java 등의 언어의 유효범위 : { } (Block)
if(window) {
var x =123;
}
console.log(x);
블록이 끝났다고(})
유효범위가 끝나지
않는다.
JavaScript의 유
효범위 : 함수
4. 다른 언어와 다른 유효범위 Scope
1. 기본개념부터 잡아보자
2. 호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
Quiz.
function factorial() {
return function(x) {
if (x <= 1)
return 1;
else
return x * arguments.callee(x-1);
};
}
factorial()(5);
+@ 재귀함수를 구현하는 3가지 방법
arguments?
callee?
괄호는 왜 2개?
Quiz.
function factorial() {
return function(x) {
if (x <= 1)
return 1;
else
return x * arguments.callee(x-1);
};
}
factorial()(5);
+@ 재귀함수를 구현하는 3가지 방법
arguments? -> 함수가 실행될 때 생성
되는 객체
callee? -> 자신을 호출한 객체
괄호는 왜 2개? -> 첫 번째 괄호는 실
행 후에 function(x)를 리턴. 두 번째 괄
호를 통해 function(x)를 실행.
재귀 - Function Declaration
function factorial(x) {
if (x <= 1) return 1;
else return x * factorial(x-1);
}
factorial(5);
=> 어느 곳에서든지 이름으로 호출 가능
+@ 재귀함수를 구현하는 3가지 방법
재귀 – 메서드(Function Expression)
var factorial = function recurs(x) {
if (x <= 1) return 1;
else return x * recurs(x-1);
}
factorial(5);
=> 익명 함수에 이름을 주면 함수 내에서 사용
할 수 있다.
+@ 재귀함수를 구현하는 3가지 방법
재귀 – arguments.callee (deprecated)
var factorial = function(x) {
if (x <= 1) return 1;
else return x * arguments.callee(x-1);
}
factorial(5);
=> 함수가 호출되는 시점에 자신을 호출한 객
체를 arguments.callee에 할당한다.
+@ 재귀함수를 구현하는 3가지 방법
참고자료
- http://www.ecma-international.org/ecma-262/5.1/
- https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Operators/this
- 자바스크립트 완벽가이드 데이비드 플래너건
- 자바스크립트 핵심 가이드 더글라스 크락포드
- 자바스크립트 닌자 비급 존 레식, 베어 바이볼트
- 몰입! 자바스크립트 김영보
2. 호출패턴에 따라 달라지는 this

Weitere ähnliche Inhalte

Was ist angesagt?

Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
ETRIBE_STG
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
유진 변
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 

Was ist angesagt? (20)

Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
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)
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 
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.기초
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Javascript
JavascriptJavascript
Javascript
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229
 
iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
 

Ähnlich wie Javascript 함수(function) 개념, 호출패턴, this, prototype, scope

Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
knight1128
 

Ähnlich wie Javascript 함수(function) 개념, 호출패턴, this, prototype, scope (20)

javascript01
javascript01javascript01
javascript01
 
[JS] Function.prototype.bind
[JS] Function.prototype.bind[JS] Function.prototype.bind
[JS] Function.prototype.bind
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Function
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Java script
Java scriptJava script
Java script
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
06장 함수
06장 함수06장 함수
06장 함수
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 

Javascript 함수(function) 개념, 호출패턴, this, prototype, scope

  • 2. 1. 기본개념부터 잡아보자 2. 호출패턴에 따라 달라지는 this 3. 상속을 가능하게 해주는 Prototype 4. 다른 언어와 다른 유효범위 Scope +@ 재귀함수를 구현하는 3가지 방법
  • 3. 1.기본개념부터 잡아보자 2. 호출패턴에 따라 달라지는 this 3. 상속을 가능하게 해주는 Prototype 4. 다른 언어와 다른 유효범위 Scope +@ 재귀함수를 구현하는 3가지 방법
  • 4. 함수 호출되거나 실행될 수 있는 자바스크립트 코드 블록 모듈화의 근간 자바스크립트는 함수형 언어 일급객체(First class citizen) 1. 기본개념
  • 5. 함수 vs. 메서드 console.dir() 은 함수일까? 메서드일까? function funcA() { /* 코드 블록*/ } vs. var objA = { funcA : function() { /* 코드 블록 */ } } 1. 기본개념
  • 6. 함수 vs. 메서드 함수를 객체의 속성에 저장하는 경우 => 메서드(method) console.dir()의 dir역시 console 객체의 하나의 속성 1. 기본개념
  • 7. 내장함수(built-in function) 미리 생성되어 있는 함수들 parseInt(), Math.exp() 등등 1. 기본개념
  • 8. 함수의 종류 FunctionDeclaration vs. FunctionExpression funcA(); function funcA() { console.log('funcA has called'); } // 호출됨 * FunctionDeclaration은 Hoisting이 발생한다. (단, 정식명칭은 아니다.) 1. 기본개념 Quiz. funcB(); var funcB = function() { console.log('funcB has called'); }; // 에러
  • 9. Quiz. console.log(a); var a = 1; var a = function(){}; console.log(a); 1. 기본개념 console.log(a); var a = 1; function a() {}; console.log(a); console.log(a); function a() {}; var a = 1; console.log(a); 각각의 출력 결과는?
  • 10. Quiz. console.log(a); var a = 1; var a = function(){}; console.log(a); // undefined // function (){} 1. 기본개념 console.log(a); var a = 1; function a() {}; console.log(a); // function a() {} // 1 console.log(a); function a() {}; var a = 1; console.log(a); // function a() {} // 1
  • 11. 그 외의 함수들 즉시실행함수 (function(){ console.log("Right now!") })(); 1. 기본개념 중첩된 함수 혹은 내부함수 function a() { function b() { } } => closure
  • 12. 함수 전달인자 - arguments function maxNum(/* 어떤 값이 들어와도 상관 없음 */) { var max = Number.NEGATIVE_INFINITY; for(var idx in arguments) { if(!isNaN(arguments[idx]) && arguments[idx]>max) { max = Number(arguments[idx]); } } return max; } maxNum(1, 21, 3, undefined, 5, 123, false, '1234', 'test'); => 가변전달인자 varargs(variable length arguments) 1. 기본개념
  • 13. Arguments 객체 - 함수 내부에 존재하는 객체 function dirArgu(/*파라미터 선언 없음*/) { console.dir(arguments); } dirArgu(1); dirArgu(1,2,3,4,5,6,7); 1. 기본개념
  • 14. 1. 기본개념부터 잡아보자 2.호출패턴에 따라 달라지는 this 3. 상속을 가능하게 해주는 Prototype 4. 다른 언어와 다른 유효범위 Scope +@ 재귀함수를 구현하는 3가지 방법
  • 15. 호출패턴과 this 1. 메서드 호출 패턴 - 호출하는 패턴에 따라 this라는 추가적인 매개변수를 다르게 초기화 한다. var objA = { sum : 0 , add : function(addVal) { this.sum += addVal; return this.sum; } } objA.sum; objA.add(2); objA.add(3); var directAddCall = objA.add; directAddCall(2); this === objA 2. 호출패턴에 따라 달라지는 this this === window ★ This -> 호출한 함수가 속 한 오브젝트를 참조
  • 16. 2. 함수 호출 function funcA() { console.dir(this); }; console.dir(funcA()); 2. 호출패턴에 따라 달라지는 this this === window function funcA() { "use strict"; console.dir(this); }; funcA(); window.funcA(); this === undefined this === window
  • 17. 3. 생성자 호출 function FuncA() {}; var funcB = new FuncA(); FuncA.prototype.checkThis = function(){ console.dir(this); }; funcB.checkThis(); 2. 호출패턴에 따라 달라지는 this this === FuncA
  • 18. 4. call 과 apply function A(a,b,c) { console.log(this.x, this.y, a, b, c); } A(); A.call({x:1,y:2}); A.apply({x:1,y:2},[3,4,5]); 명시적으로 this에 mapping시킬 프로퍼티들을 넘길 수 있다 2. 호출패턴에 따라 달라지는 this
  • 19. + bind를 통한 this mapping var newA = A.bind({x:3,y:4}) var newA2 = A.bind({x:3,y:4,a:5}) 2. 호출패턴에 따라 달라지는 this call, apply -> 호출시점에 일시적인 매핑 bind -> 영구적인 Binding
  • 20. 1. 기본개념부터 잡아보자 2. 호출패턴에 따라 달라지는 this 3.상속을 가능하게 해주는 Prototype 4. 다른 언어와 다른 유효범위 Scope +@ 재귀함수
  • 21. 함수의 프로토타입 상속 function FuncA() {} var funcA1 = new FuncA(); console.dir(funcA1); FuncA.prototype.addedMethod = function(){ console.log("I'm added"); }; console.dir(funcA1); 3. 상속을 가능하게 해주는 Prototype => __proto__ 는 생성자의 prototype을 바라보고 있다.
  • 22. * prototype chaining 맛보기 var a = { func : function(){ console.log(this.val); } }; var b = Object.create(a); var c = Object.create(b); var d = Object.create(c); var e = Object.create(d); b.val = 'b.val'; a.val = ‘a.val‘; e.func(); // b.val e .__proto__ .__proto__ .__proto__ .__proto__ === a; // true 3. 상속을 가능하게 해주는 Prototype
  • 23. 1. 기본개념부터 잡아보자 2. 호출패턴에 따라 달라지는 this 3. 상속을 가능하게 해주는 Prototype 4. 다른 언어와 다른 유효범위 Scope +@ 재귀함수를 구현하는 3가지 방법
  • 24. Quiz. function aa() { var a = 1; function b() { var a = 2; c(); } function c() { console.log(a); } b(); } aa(); a = ? 4. 다른 언어와 다른 유효범위 Scope
  • 25. Quiz. 항목별 유효범위 4. 다른 언어와 다른 유효범위 Scope function outer() { debugger; inner(); var a = 1; function inner() { var x = 2; } var b = 2; if(a==1) { var c = 3; } console.log(c); } outer(); 항목별 Scope는 어떻게 될까? outer() inner() x, a, b, c
  • 26. 항목별 유효범위 Scope 결정요소 : 어디에 선언되었느냐? 변수냐? 함수냐? 4. 다른 언어와 다른 유효범위 Scope function outer() { debugger; inner(); var a = 1; function inner() { var x = 2; } var b = 2; if(a==1) { var c = 3; } console.log(c); } outer(); 항목별 Scope : (순서대로) outer(), inner(), x, a, b, c !! If 블록을 넘어간다. * JavaScript의 Scope는 블록단위가 아니라 함수 단위
  • 27. 블록 vs. 함수 유효범위 C, Java 등의 언어의 유효범위 : { } (Block) if(window) { var x =123; } console.log(x); 블록이 끝났다고(}) 유효범위가 끝나지 않는다. JavaScript의 유 효범위 : 함수 4. 다른 언어와 다른 유효범위 Scope
  • 28. 1. 기본개념부터 잡아보자 2. 호출패턴에 따라 달라지는 this 3. 상속을 가능하게 해주는 Prototype 4. 다른 언어와 다른 유효범위 Scope +@ 재귀함수를 구현하는 3가지 방법
  • 29. Quiz. function factorial() { return function(x) { if (x <= 1) return 1; else return x * arguments.callee(x-1); }; } factorial()(5); +@ 재귀함수를 구현하는 3가지 방법 arguments? callee? 괄호는 왜 2개?
  • 30. Quiz. function factorial() { return function(x) { if (x <= 1) return 1; else return x * arguments.callee(x-1); }; } factorial()(5); +@ 재귀함수를 구현하는 3가지 방법 arguments? -> 함수가 실행될 때 생성 되는 객체 callee? -> 자신을 호출한 객체 괄호는 왜 2개? -> 첫 번째 괄호는 실 행 후에 function(x)를 리턴. 두 번째 괄 호를 통해 function(x)를 실행.
  • 31. 재귀 - Function Declaration function factorial(x) { if (x <= 1) return 1; else return x * factorial(x-1); } factorial(5); => 어느 곳에서든지 이름으로 호출 가능 +@ 재귀함수를 구현하는 3가지 방법
  • 32. 재귀 – 메서드(Function Expression) var factorial = function recurs(x) { if (x <= 1) return 1; else return x * recurs(x-1); } factorial(5); => 익명 함수에 이름을 주면 함수 내에서 사용 할 수 있다. +@ 재귀함수를 구현하는 3가지 방법
  • 33. 재귀 – arguments.callee (deprecated) var factorial = function(x) { if (x <= 1) return 1; else return x * arguments.callee(x-1); } factorial(5); => 함수가 호출되는 시점에 자신을 호출한 객 체를 arguments.callee에 할당한다. +@ 재귀함수를 구현하는 3가지 방법
  • 34. 참고자료 - http://www.ecma-international.org/ecma-262/5.1/ - https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Operators/this - 자바스크립트 완벽가이드 데이비드 플래너건 - 자바스크립트 핵심 가이드 더글라스 크락포드 - 자바스크립트 닌자 비급 존 레식, 베어 바이볼트 - 몰입! 자바스크립트 김영보 2. 호출패턴에 따라 달라지는 this