11. 콜백
- 비연속적인 이벤트를 다루는데 좀더 효율적인 방법이다.
- 예를들어 서버로부터 응답을 기다리지 않고 바로 리턴을 한 후 응답이 왔을 때
해당 함수를 호출하는 것이 더 효율적이다.
[code javascript]
// 이 예제는 개념적인 설명이므로 함수 이름에 신경쓸 필요가 없다.
// send_request_synchronously 함수를 호출하면
// 리턴값이 올 때까지 대기해야한다.
request = prepare_the_request ();
response = send_request_synchronously (request);
display (response);
// send_request_asynchronously 함수는 호출즉시 바로 리턴되며
// 리턴값이 오면 함께 넘긴 함수를 직접 호출해준다.
request = prepare_the_request ();
send_request_asynchronously (request, function (response) {
display (response);
});
[/code]
12. 모듈
- 모듈은 내부의 상태나 구현 내용을 숨기고 인터페이스만 제공하는 함수나 객체이다.
- 함수와 클로저를 사용하면 모듈을 만들 수 있다.
- 예제1 : String 객체에 deentityify 메소드를 추가한다.
이 메소드는 문자열에서 HTML 엔터티를 찾고 상응하는 문자열로 대체한다.
[code javascript]
var print = function (strLog) {
document.write (strLog);
document.write ('<br>');
};
// 엔터티의 이름과 상응하는 문자들이 담긴 객체가 필요하다.
// 이 객체를 위치할 수 있는 부분은
// 1. 전역변수 - 가능한 사용을 하지 말아야 한다.
// 2. 함수 내에 정의 - 호출시 마다 객체화를 시켜야하기 때문에 실행시간 비용이 부담된다.
// 3. 클로저에 두고 이 객체를 access 할 수 있는 메소드를 따로 둔다.
// 함수 객체에 method 추가
Function.prototype.method = function (name, func) {
if (!this.prototype[name]) {
this.prototype[name] = func;
}
};
String.method ('convertHTML', function () {
var entity = {
quot: '"',
lt: '<',
gt: '>'
}
return function () {
return this.replace (/&([^&;]+);/g, function (a, b) {
var r = entity[b];
return typeof r ==== 'string' ? r : a;
}
);
} ()); // 호출한 결과 리턴
print ('<">'.convertHTML ()); // <">
// string.replace (/&([^&;]+);/g, function (a, b) { 에서
// a 는 검색한 문자열, b 는 정규식으로 찾은 문자열을 말한다.
[/code]
- 모듈 패턴은 안전한 객체를 생성하는데도 사용된다.
[code javascript]
var serial_maker = function () {
var prefix = '';
var seq = 0;
return {
set_prefix : function (p) {
prefix = String (p);
},
set_seq : function (s) {
seq = s;
},
gensym : function () {
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker ();
seqer.set_prefix ('Q');
seqer.set_seq (1000);
var unique = seqer.gensym (); // Q1000
// set_prefix 나 set_seq 를 거치지 않으면 직접
// var prefix, var seq 를 접근할 수 있는 방법이 없다.
// 앞에서 배운 this, that 방법을 사용한 것도 아니기 때문에 불가능하다.
// serial_maker 가 정의한 메소드만 가능하다.
// 아래는 확장해서 접근하려는 예
seqer.get_prefix = function () {
return prefix;
};
try
{
print (seqer.get_prefix ());
}
catch (e) {
print (e.name + ': ' + e.description);
} // ReferenceError: undefined
[/code]
13. 연속 호출 (Cascade)
- 만일 모든 메소드가 this를 반환한다면 연속적인 호출이 가능하다.
[code javascript]
var cascade = {
method1: function () {
print ('1');
return this;
},
method2: function() {
print ('2');
return this;
}
};
cascade.method1 ().method2 ();
/* 결과
1
2
*/
[/code]
공부한 책 : 자바스크립트 핵심가이드 - 더글라스 크락포드
- 비연속적인 이벤트를 다루는데 좀더 효율적인 방법이다.
- 예를들어 서버로부터 응답을 기다리지 않고 바로 리턴을 한 후 응답이 왔을 때
해당 함수를 호출하는 것이 더 효율적이다.
[code javascript]
// 이 예제는 개념적인 설명이므로 함수 이름에 신경쓸 필요가 없다.
// send_request_synchronously 함수를 호출하면
// 리턴값이 올 때까지 대기해야한다.
request = prepare_the_request ();
response = send_request_synchronously (request);
display (response);
// send_request_asynchronously 함수는 호출즉시 바로 리턴되며
// 리턴값이 오면 함께 넘긴 함수를 직접 호출해준다.
request = prepare_the_request ();
send_request_asynchronously (request, function (response) {
display (response);
});
[/code]
12. 모듈
- 모듈은 내부의 상태나 구현 내용을 숨기고 인터페이스만 제공하는 함수나 객체이다.
- 함수와 클로저를 사용하면 모듈을 만들 수 있다.
- 예제1 : String 객체에 deentityify 메소드를 추가한다.
이 메소드는 문자열에서 HTML 엔터티를 찾고 상응하는 문자열로 대체한다.
[code javascript]
var print = function (strLog) {
document.write (strLog);
document.write ('<br>');
};
// 엔터티의 이름과 상응하는 문자들이 담긴 객체가 필요하다.
// 이 객체를 위치할 수 있는 부분은
// 1. 전역변수 - 가능한 사용을 하지 말아야 한다.
// 2. 함수 내에 정의 - 호출시 마다 객체화를 시켜야하기 때문에 실행시간 비용이 부담된다.
// 3. 클로저에 두고 이 객체를 access 할 수 있는 메소드를 따로 둔다.
// 함수 객체에 method 추가
Function.prototype.method = function (name, func) {
if (!this.prototype[name]) {
this.prototype[name] = func;
}
};
String.method ('convertHTML', function () {
var entity = {
quot: '"',
lt: '<',
gt: '>'
}
return function () {
return this.replace (/&([^&;]+);/g, function (a, b) {
var r = entity[b];
return typeof r ==== 'string' ? r : a;
}
);
} ()); // 호출한 결과 리턴
print ('<">'.convertHTML ()); // <">
// string.replace (/&([^&;]+);/g, function (a, b) { 에서
// a 는 검색한 문자열, b 는 정규식으로 찾은 문자열을 말한다.
[/code]
- 모듈 패턴은 안전한 객체를 생성하는데도 사용된다.
[code javascript]
var serial_maker = function () {
var prefix = '';
var seq = 0;
return {
set_prefix : function (p) {
prefix = String (p);
},
set_seq : function (s) {
seq = s;
},
gensym : function () {
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker ();
seqer.set_prefix ('Q');
seqer.set_seq (1000);
var unique = seqer.gensym (); // Q1000
// set_prefix 나 set_seq 를 거치지 않으면 직접
// var prefix, var seq 를 접근할 수 있는 방법이 없다.
// 앞에서 배운 this, that 방법을 사용한 것도 아니기 때문에 불가능하다.
// serial_maker 가 정의한 메소드만 가능하다.
// 아래는 확장해서 접근하려는 예
seqer.get_prefix = function () {
return prefix;
};
try
{
print (seqer.get_prefix ());
}
catch (e) {
print (e.name + ': ' + e.description);
} // ReferenceError: undefined
[/code]
13. 연속 호출 (Cascade)
- 만일 모든 메소드가 this를 반환한다면 연속적인 호출이 가능하다.
[code javascript]
var cascade = {
method1: function () {
print ('1');
return this;
},
method2: function() {
print ('2');
return this;
}
};
cascade.method1 ().method2 ();
/* 결과
1
2
*/
[/code]
공부한 책 : 자바스크립트 핵심가이드 - 더글라스 크락포드


