Javascript 함수 질문

doodoo의 이미지

드디어 프로그래밍QnA에도 질문을 올릴때도 있군요 ^^;

자바스크립트를 보고 있습니다. 근데 객체 생성에 관련하여 이해할수 없는 함수가 있군요
럭키뷰 이고 이부분만 프리로 풀려 있어요 직접기능을 보고 싶으시면 http://luckyteam.co.uk 가보셔도 되고요
제가 궁금한것은..

function luckyView_createMethodReference(object, methodName) {
    var args = arguments;
        return function () {
        object[methodName].apply(object, arguments, "sssss");
    };
};
 
function luckyView(title, images, start, mapCont, baseuri) {
    this.sx = 0;
    this.sy = 0;
    this.z = start;
    this.baseuri = baseuri;
 
    this.images = images;
 
    this.scaleImagePlus = 0;
    this.scaleImageMinus = 0;
    this.map = 0;
    this.mapCont = _el(mapCont);
    this.mapImage = 0;
    this.help = 0;
    this.title = title;
 
    this.lvisim = luckyView_createMethodReference(this, "visim");
    this.lunzoom = luckyView_createMethodReference(this, "unzoom");
    this.lzoom = luckyView_createMethodReference(this, "zoom");
    this.lmap_move = luckyView_createMethodReference(this, "map_move")
};

여기 중에 function luckyView(title, images, start, mapCont, baseuri) { 이 부분은
객체 생성자 처럼 보입니다. 맞나요?
그리고 function luckyView_createMethodReference(object, methodName) { 이 부분은
중간에
        return function () {
        object[methodName].apply(object, arguments, "sssss");
    };

이렇게 리턴한다고 되어 있습니다. 보통은 리턴은 return function_1(); 처럼 하는것
아닌가요?
hongminhee의 이미지

JavaScript의 객체 모델은 조금 재미있게 되어 있습니다. 클래스가 없고, 대신 함수로 유사 생성자를 만들어서 사용합니다. 함수 호출 표현식 앞에 new 키워드를 붙이면, 함수.prototype 이라는 원형 객체를 복제한 것을 this로 전달해줍니다.

return function () {
    object[methodName].apply(object, arguments, "sssss");
};

function(...) { ... } 구문은 함수 리터럴입니다. JavaScript에서는 함수가 참조 및 전달 가능한 객체이기 때문에 저런 것이 가능합니다. 저렇게 함수를 반환하는 함수를 고차 함수(higher-order function)라고 하는데 함수형 언어에서는 흔히 쓰는 코드이구요.

값으로서의 함수라는 개념이 이상하게 느껴지신다면, C의 함수 포인터나 C++에서의 함수자(functor) 같은 것을 생각하시면 될 듯합니다.

doodoo의 이미지

그러면 luckyView_createMethodReference 함수는 실제로 object[methodName].apply 함수를
실행하는것으로만 이해하면 될까요?

cleol의 이미지

luckyView_createMethodReference 함수는 실제로 object[methodName].apply 함수를 실행하지 않습니다.
object[methodName].apply 함수를 실행하는 함수를 리턴할 뿐입니다.
object[methodName].apply 함수를 실행하고 싶으면

var methodRef = luckyView_createMethodReference(object, methodName)
methodRef();

처럼 해야합니다. 함수 객체는 여러가지 용도가 있겠지만 callback을 위해서 사용하는 경우가 많습니다.

function func(callback) {
	var s = prompt("");
	callback(s);// callback.apply(s) 와 동일
}
 
var methodRef1 = luckyView_createMethodReference(document, write);
func(methodRef1); //프롬프트 창이 뜸.  Hello 를 입력하면, document.write("Hello") 가 실행됨.
 
var methodRef2 = luckyView_createMethodReference(window, open);
func(methodRef2); //프롬프트 창이 뜸.  abc.html 를 입력하면, window.open("abc.html") 가 실행됨.

뭐 이런 식이지요.

doodoo의 이미지

아...조금 햇갈리는군요
좀더 이것저것 좀더 알아봐야 하겠군요...ㅠㅠ

doodoo의 이미지

뜨아 이글 보니 더 헷갈리네요...
http://www.ibm.com/developerworks/kr/library/j-cb12196/index.html?ca=drs-kr

 <button onclick="funct = temperature()();">Temperature</button>

이렇게 사용하시는 분들 있으세요?

happyjun의 이미지

그냥 기초 내용 부터 다시 보시는 것이 좋을 것 같습니다.

이쪽에서 유명하신 Douglas Crockford의 강의 비디오가 있습니다.

http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.1710507

----------------------------------------
http://moim.at
http://mkhq.co.kr

----------------------------------------
http://moim.at
http://mkhq.co.kr

doodoo의 이미지

아...감사합니다...

시작 부분만 잠깐 봤는데...영어네요..ㅠㅠ

열심히 해독은 잘 않되겠지만 ....봐야 하겠네요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.