2010-07-02 5 views
1

나는 폐쇄 (나는 그게 무엇인지 생각 ..), 그냥 같은, 미래의 어떤 시점에서 지역 변수와 함수를 실행하고 싶습니다 사용하려고 해요 :클로저를 사용하여 향후 함수를 실행 하시겠습니까?

function boo() { 
    var message = 'hello!'; 
    var grok = function() { alert(message); } 
    foo(grok); 
} 

function foo(myClosure) { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      myClosure(); 
     } 
    } 
} 

전역 변수 등을 사용하여이 문제를 해결할 수 있지만 적어도 조금 더 깨끗하게 보이기 때문에 위와 같은 것을 사용합니다. 어떻게 (가능한 경우) 이것을합니까?

감사

----------- 업데이트 --------------------

미안하지 않았다 분명 - 이것이 클로저에 대한 올바른 구문인지 궁금 해서요, 나는 그것을 시도하고 괜찮아 보인다. 고맙습니다.

+1

무엇이 문제입니까? – kennytm

+0

URL과 같은 $ .ajax 전화가 누락 된 것 외에는 나에게 잘 들립니다. – Pointy

답변

0

원하는 것은 무엇입니까?

var boo = (function() { 
    var message = 'hello!'; 
    return function() { 
     foo(function() { 
     alert(message); 
     }); 
    }; 
})(); 

function foo(myClosure) { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      myClosure(); 
     } 
    } 
} 

하거나

function boo() { 
    $.ajax({ 
     timeout: 8000, 
     success: function(json) { 
      alert('hello!'); 
      // do sth with json 
      // ... 
     } 
    }); // <- missed a paren 
} 

예는 BTW 원하는 것을 알고 너무 간단합니다.

+0

-1 안녕하세요 Pointy ... :) – galambalazs

0

당신이 실제로 AJAX 호출을 만들고 싶어하지 않는 한, setTimeout이의 라인을 따라 더 많은 수 있습니다 당신은 무엇을 찾고 : 귀하의 질문에 "의 라인을 따라 더 있었다면

function foo(myClosure) { 
    setTimeout(myClosure, 8000); // execute the supplied function after 8 seconds 
} 

나는 폐쇄를 만드는 오전 올바르게? "라고 대답하면, 귀하의 기능 boo이 올바르게 작동합니다.

1

끝 부분에 누락 된 괄호를 제외하고 기존 코드는 완벽하게 잘 보입니다. ;)

클로저 개념을 더 깊이 이해하려면이 방법으로 생각하십시오. 클로저 된 언어의 내용이 정의 될 때마다 정의 된 로컬 범위에 대한 참조가 유지됩니다.

코드의 경우 $ .ajax()에 대한 매개 변수는 새로 만든 함수 ("{timeout : 8000 등}")이며 새로 생성 된 함수 (익명의 "성공 "함수)를 사용하여 동일한 범위의 로컬 변수 ("myClosure ")에 대한 참조를 포함합니다. 마지막으로 "success"함수가 실행되면 "foo()"가 오래 전에 실행 되더라도 "myClosure"에 도달하기 위해 로컬 범위에 대한 해당 참조를 사용합니다. 단점은 클로저에 묶여있는 불안정한 데이터로 끝날 수 있다는 것입니다. 데이터는 모든 참조가 제거 될 때까지 해제되지 않습니다.

회상 해보면 나는 당신을 혼란스럽게 만들었을 것입니다. 죄송합니다. : \

관련 문제