SlideShare a Scribd company logo
Javascript -
Function.prototype.bind
Problem
● 반복되는 콜백 함수
async.waterfall([
// ...
function(callback) {
Model.Users.findUserByEmailAndPassword(username, password).then(function(user) {
callback(null, user);
}).catch(function(err) {
callback(err);
});
},
function(user, callback) {
Model.UserPermission.findByUserId(user.id).then(function(perms) {
user.perms = perms;
callback(null, user);
}).catch(function(err) {
callback(err);
})
}
], function(err, result) {
///
});
개발자가 지양해야 하는
것 중 가장 큰 하나는 중복
코드를 양산하는 것이다
그럼 어떻게 해야 할까요?
● 흔히 생각할 수 있는 방법은? 공통함수화!
function(err) {
callback(err);
}
이 녀석을 공통 함수화시키면 될 것 같다!
문제는?? callback 변수가 async package 내부에서
정의하는 것이라 외부에서는 저것을 정의할 수 없다.
하지만 우리에겐 구글느님이 있으니
물어보기로 합니다.
How to implement reusable callback functions
var callback = function(x1, y1, result) {
// do something with x1 and y1
};
function(...) {
// closure vars x1, y1
// option 1: make your own partial function
foo.bar( function(result) { return callback(x1, y1, result); });
// with ES6: foo.bar( (result) => callback(x1, y1, result); });
// option 2: use Function.bind
foo.bar( callback.bind(this, x1, y1); );
}
???
Function.prototype.bind()
● fun.bind(thisArg[, arg1[, arg2[, ...]]])
○ 특정 context에 한정된 새로운 함수를 만드는 함수
○ thisArg: 한정시킬 context
○ arg: fun을 호출할 때 앞에 붙일 arguments
● 사용처
○ Callback 함수 등에서 현재 context를 사용하고 싶을 때
○ Partially applied function 을 만들고 싶을 때
○ 특정 context를 미리 갖는 생성자를 만들고 싶을 때
○ 특정 함수를 호출하는 shortcut을 만들고 싶을 때
참고: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
How to implement reusable callback functions
var callback = function(x1, y1, result) {
// do something with x1 and y1
};
function(...) {
// closure vars x1, y1
// option 1: make your own partial function
foo.bar( function(result) { return callback(x1, y1, result); });
// with ES6: foo.bar( (result) => callback(x1, y1, result); });
// option 2: use Function.bind
foo.bar( callback.bind(this, x1, y1); );
} callback 이라는 함수를 현재 context에 bound 되고 x1,
y1을 앞에 미리 적용시킨 함수를 만들어서 callback으로
전달한다
Solution
var dbFailureHandler = function(msg, callback, err) {
log.error(msg, err);
callback(err);
};
async.waterfall([
// 사용자 탐색
function(callback) {
Model.Users.findUserByEmailAndPassword(username, password).then(function(user) {
callback(null, user);
}).catch(dbFailureHandler.bind(this, 'Fail to find user due to DB operation!', callback));
},
function(user, callback) {
Model.UserPermission.findByUserId(user.id).then(function(perms) {
user.perms = perms;
callback(null, user);
}).catch(dbFailureHandler.bind(this, 'Fail to find user permission due to DB operation!', callback));
}],
// callback
}
Javascript는
그동안 우리가 알았던 언어와
참 다르더라구요
하지만 개발자가 고민하는
문제는 비슷하니 해결 방법을 찾고
개선하고 공유
합시다.
나의 삽질고생 -> 팀 전체의 효율

More Related Content

What's hot

7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
HyeonSeok Choi
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
Hyunsoo Jung
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
jeong seok yang
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
Kim Hunmin
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
Park JoongSoo
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Circulus
 
Promise and Bluebird
Promise and BluebirdPromise and Bluebird
Promise and Bluebird
Daniel Ku
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
Dong Jun Kwon
 
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
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
beom kyun choi
 
React로 TDD 쵸큼 맛보기
React로 TDD 쵸큼 맛보기React로 TDD 쵸큼 맛보기
React로 TDD 쵸큼 맛보기
Kim Hunmin
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
Circulus
 
Hello c++ world
Hello c++ worldHello c++ world
Hello c++ world
. Ruvendix
 
100511 boost&tips 최성기
100511 boost&tips 최성기100511 boost&tips 최성기
100511 boost&tips 최성기
sung ki choi
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
ES6 for Node.js Study
ES6 for Node.js StudyES6 for Node.js Study
ES6 for Node.js Study
승빈이네 공작소
 
Hello world
Hello worldHello world
Hello world
. Ruvendix
 
ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차
승빈이네 공작소
 
[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩
jusingame
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기
인권 김
 

What's hot (20)

7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
 
Promise and Bluebird
Promise and BluebirdPromise and Bluebird
Promise and Bluebird
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 
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)
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
React로 TDD 쵸큼 맛보기
React로 TDD 쵸큼 맛보기React로 TDD 쵸큼 맛보기
React로 TDD 쵸큼 맛보기
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
 
Hello c++ world
Hello c++ worldHello c++ world
Hello c++ world
 
100511 boost&tips 최성기
100511 boost&tips 최성기100511 boost&tips 최성기
100511 boost&tips 최성기
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
ES6 for Node.js Study
ES6 for Node.js StudyES6 for Node.js Study
ES6 for Node.js Study
 
Hello world
Hello worldHello world
Hello world
 
ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차
 
[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩
 
[하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기 [하코사 세미나] 비전공자의 자바스크립트 도전기
[하코사 세미나] 비전공자의 자바스크립트 도전기
 

Similar to [JS] Function.prototype.bind

헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
은숙 이
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
Circulus
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Young-Beom Rhee
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
yongwoo Jeon
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
Young-Beom Rhee
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
Circulus
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
Tommy C. Kang
 
JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)
지수 윤
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
Young-Beom Rhee
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
Yong Joon Moon
 
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-dynamicknight1128
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
HyeonSeok Choi
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
Hyosang Hong
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
Taegon Kim
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
Young-Beom Rhee
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
Park Jonggun
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Young-Beom Rhee
 

Similar to [JS] Function.prototype.bind (20)

헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
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
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
 

More from Jinhyuck Kim

Reactive programming vs reactive systems
Reactive programming vs reactive systemsReactive programming vs reactive systems
Reactive programming vs reactive systems
Jinhyuck Kim
 
Docker storage
Docker storageDocker storage
Docker storage
Jinhyuck Kim
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internal
Jinhyuck Kim
 
JWT (JSON web token)
JWT (JSON web token)JWT (JSON web token)
JWT (JSON web token)
Jinhyuck Kim
 
Serverless 101
Serverless 101Serverless 101
Serverless 101
Jinhyuck Kim
 
기술 부채란
기술 부채란 기술 부채란
기술 부채란
Jinhyuck Kim
 

More from Jinhyuck Kim (6)

Reactive programming vs reactive systems
Reactive programming vs reactive systemsReactive programming vs reactive systems
Reactive programming vs reactive systems
 
Docker storage
Docker storageDocker storage
Docker storage
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internal
 
JWT (JSON web token)
JWT (JSON web token)JWT (JSON web token)
JWT (JSON web token)
 
Serverless 101
Serverless 101Serverless 101
Serverless 101
 
기술 부채란
기술 부채란 기술 부채란
기술 부채란
 

[JS] Function.prototype.bind

  • 2. Problem ● 반복되는 콜백 함수 async.waterfall([ // ... function(callback) { Model.Users.findUserByEmailAndPassword(username, password).then(function(user) { callback(null, user); }).catch(function(err) { callback(err); }); }, function(user, callback) { Model.UserPermission.findByUserId(user.id).then(function(perms) { user.perms = perms; callback(null, user); }).catch(function(err) { callback(err); }) } ], function(err, result) { /// }); 개발자가 지양해야 하는 것 중 가장 큰 하나는 중복 코드를 양산하는 것이다
  • 3. 그럼 어떻게 해야 할까요? ● 흔히 생각할 수 있는 방법은? 공통함수화! function(err) { callback(err); } 이 녀석을 공통 함수화시키면 될 것 같다! 문제는?? callback 변수가 async package 내부에서 정의하는 것이라 외부에서는 저것을 정의할 수 없다.
  • 4.
  • 5. 하지만 우리에겐 구글느님이 있으니 물어보기로 합니다.
  • 6. How to implement reusable callback functions var callback = function(x1, y1, result) { // do something with x1 and y1 }; function(...) { // closure vars x1, y1 // option 1: make your own partial function foo.bar( function(result) { return callback(x1, y1, result); }); // with ES6: foo.bar( (result) => callback(x1, y1, result); }); // option 2: use Function.bind foo.bar( callback.bind(this, x1, y1); ); } ???
  • 7. Function.prototype.bind() ● fun.bind(thisArg[, arg1[, arg2[, ...]]]) ○ 특정 context에 한정된 새로운 함수를 만드는 함수 ○ thisArg: 한정시킬 context ○ arg: fun을 호출할 때 앞에 붙일 arguments ● 사용처 ○ Callback 함수 등에서 현재 context를 사용하고 싶을 때 ○ Partially applied function 을 만들고 싶을 때 ○ 특정 context를 미리 갖는 생성자를 만들고 싶을 때 ○ 특정 함수를 호출하는 shortcut을 만들고 싶을 때 참고: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
  • 8. How to implement reusable callback functions var callback = function(x1, y1, result) { // do something with x1 and y1 }; function(...) { // closure vars x1, y1 // option 1: make your own partial function foo.bar( function(result) { return callback(x1, y1, result); }); // with ES6: foo.bar( (result) => callback(x1, y1, result); }); // option 2: use Function.bind foo.bar( callback.bind(this, x1, y1); ); } callback 이라는 함수를 현재 context에 bound 되고 x1, y1을 앞에 미리 적용시킨 함수를 만들어서 callback으로 전달한다
  • 9. Solution var dbFailureHandler = function(msg, callback, err) { log.error(msg, err); callback(err); }; async.waterfall([ // 사용자 탐색 function(callback) { Model.Users.findUserByEmailAndPassword(username, password).then(function(user) { callback(null, user); }).catch(dbFailureHandler.bind(this, 'Fail to find user due to DB operation!', callback)); }, function(user, callback) { Model.UserPermission.findByUserId(user.id).then(function(perms) { user.perms = perms; callback(null, user); }).catch(dbFailureHandler.bind(this, 'Fail to find user permission due to DB operation!', callback)); }], // callback }
  • 10. Javascript는 그동안 우리가 알았던 언어와 참 다르더라구요
  • 11. 하지만 개발자가 고민하는 문제는 비슷하니 해결 방법을 찾고 개선하고 공유 합시다.
  • 12. 나의 삽질고생 -> 팀 전체의 효율