티스토리 뷰
Daylogs/Javascript
javascript replace 함수에서 패러미터로 함수 넣기 (parameters as function)
ohgyun 2009. 9. 29. 13:32
발생일: 2009.09.29
문제:
프렌드 홍이 어떤 똘똘이 아저씨가 만든 자바스크립트 HTML 파서(HTMLParser) 소스를 보여준다.
그 코드 안에 있는 replace 함수가 동작하는 부분이 신기하다고 한다.
소스를 보면 시작 태그를 파싱하는 부분이 있는데, 아래와 같은 코드가 있다.
var startTag = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
문제:
프렌드 홍이 어떤 똘똘이 아저씨가 만든 자바스크립트 HTML 파서(HTMLParser) 소스를 보여준다.
그 코드 안에 있는 replace 함수가 동작하는 부분이 신기하다고 한다.
소스를 보면 시작 태그를 파싱하는 부분이 있는데, 아래와 같은 코드가 있다.
var startTag = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
function parseStartTag( tag, tagName, rest, unary ) {
// 어쩌고 저쩌고
}
// 어쩌고 저쩌고 중략
match[0].replace( startTag, parseStartTag );
// 어쩌고 저쩌고
}
// 어쩌고 저쩌고 중략
match[0].replace( startTag, parseStartTag );
replace 함수는 replace(regex, string) 과 같은 형태로 호출하는 걸로 알고 있는데,
위 함수 모양을 보면 replace(regex, func) 과 같은 형태란 말이지...
코드의 다른 부분을 찾아봐도 replace 가 오버라이드 된 부분이 없다.
이건 뭘까...?
해결책:
str.replace(regexp|substr, newSubStr|function[, flags]);
위와 같은 형태로 호출하면 된다.
함수가 패러미터로 들어가게 되면, 매칭되는 값에 따라 그 함수를 수행하게 된다.
패러미터로 들어가는 함수는
function replacer(str, p1, p2, offset, s) {}
위와 같은 형태이며 각 parameter의 의미는 아래와 같다.
str: 매치된 문자열
p1, p2 ... : 매치된 문자열 중 그룹. 정규식에서 () 로 묶여진 것. $1, $2 ... 로 참조되는 값과 같은 값이다.
offset: 전체 대상 문자열에서 매치된 문자열의 offset index
s: 전체 대상 문자열
자세한 사항은 Mozilla Developer Center의 javascript replace API 를 참고하자.
#.
저 HTMLParser 를 만든 똘똘한 아저씨는 John Resig 라구 하는구나.
jquery를 만든 사람이라구 한다. 오웅~
반응형
댓글
공지사항