2012-07-26 5 views
1

에 중첩하여 setInterval에서 중첩 된 함수를 호출 나는 코드의 다음 조각 한 : 객체의 네임 스페이스 환경

var stats = { 
...., 
checkExistance : 
function(url){ 
    var newUrl = url.substring(0, url.lastIndexOf("/")) + "/asyncCheckChartExistance"; 
    var xhrObj = stats.getXhr(); 

    var poolInterval = setInterval("poll()", 100); 

    function poll(){ 
     xhrObj.open("GET", newUrl, true); 
     xhrObj.send(null); 

     xhrObj.onreadystatechange = function(){ 
      if(xhrObj.readyState === 4 && xhrObj.status === 200){ 
       if (xhrObj.responseText.length === true){ 
        console.log("Exists!"); 
        clearInterval(poolInterval); 
       } else { 
        console.log("Not Yet!"); 
       } 
      } 
     } 
    } 
}, 
} 

나는 통계 네임 스페이스를 만들었습니다. 이 네임 스페이스에서 매초마다 서버를 폴링하는 함수를 만들려고합니다. 이런 식으로이 함수에 액세스해야합니다 : stats.checkExistance(myUrl).

그러나 setInterval 함수는 poll() 함수를 볼 수 없습니다. 나는 이것이 다른 함수 안에 중첩되어 있다는 것을 고려하여 정상적인 동작이라는 것을 알고있다.

전역 네임 스페이스에이 값을 쓰면 아무런 문제가 없지만 이런 종류의 네임 스페이스에서이 작업을 수행하는 데 관심이 있습니다. 어떤 아이디어? 감사!

답변

2

때를 문자열을 setInterval으로 전달하면 기본적으로 poll이 정의되지 않는 전역 범위에서 실행됩니다 (checkExistance 함수의 범위에만 있기 때문에).

는 문제를 해결하는 대신 setInterval에 익명 함수를 전달하려면 :

var poolInterval = setInterval(function() { 
    poll(); 
}, 100); 

을 당신이 방금 대신 간격에 대한 자바 스크립트 표현/문을 작성 할 수 있습니다으로 익명 함수는 일반적으로 좋은 생각입니다 전달 하나의 함수 호출.

+1

그냥'setInterval (poll, 100);'잘 동작합니다. 여기를 감쌀 필요는 없습니다. 패턴은 하나 이상의 인수를 대상 함수에 전달하려는 경우에 유용하지만 여기서는 그렇지 않습니다. –

+0

@ imeVidas true이지만, 하나의 함수를 호출하는 것 이상을 수행해야하거나 함수에 매개 변수를 전달해야하는 경우 익명의 함수가 필요합니다. – jbabey

2

setInterval에 문자열을 전달하면 해당 문자열이 전역 코드로 해석되고 poll은 전역 함수가 아니기 때문에 참조 오류가 발생합니다.

그러나 문자열이 아닌 함수 참조를 전달 할 수 있으며 poll 기능은 setInterval 호출이 이루어되는 범위에서 사용할 수 있기 때문에, 당신은이 쓸 수 있습니다 :

var poolInterval = setInterval(poll, 100); 
1
var stat = { 
    say: function(name){ 
     function doit(){ 
      console.log(name); 
     } 
     setInterval(doit, 1000); 
    } 
}; 
stat.say("hi");​​​​​​​​​​​ 

방법을 보여주는 간단한 데모. 매초 "안녕"이라고 표시됩니다.

관련 문제