2009-11-24 10 views
5

폐쇄 (글로벌 네임 스페이스 오염을 방지하기 위해)에서 일부 기존 최상위 함수를 그룹화하려고하지만 매우 작동하지 않습니다. 작동하도록 설정합니다.클로저/범위 자바 스크립트/jQuery

먼저 익명의 기능을 제외한 모든 JS가 작동하지만 익명 함수로 을 입력하면 "crossfade is defined"오류가 발생합니다. 아무도 내가 완전히 이라는 것을 분명히 알고 있습니까?

setInterval/crossfade가 익명의 기능이 아닌 내부의 외부에서 작동하는 이유는 아직 명확하지 않습니다. start() 내부의 내용은 모두 시작() 외부의 변수/함수를 볼 수 있어야하며 최상위 익명 함수에 의해 만들어진 클로저에서 모두 이 보호되어야합니까? 내에서 crossfade() 내에 액세스하려고하지 않고 있습니다. 실행하려고 시도한 것은 단지 입니다.

(function($) { 

    //vars up here that internal functions can access 
    //also using some jquery inside here, so using $ 

    function crossfade() { 
     //body here 
    } 

    //other functions 

    function start() { 
     //body here 

     cInterval = setInterval('crossfade()', 5000); 
    } 

})(jQuery); 

답변

7

setInterval 방법은 윈도우의 범위에서 실행됩니다 대신 함수를 사용해야합니다.

cInterval = window.setInterval(function() { crossfade(); }, 5000); 
+0

고마워 이것이 나를 위해 일하고있다. –

8

클로저를 만들지 않습니다 setInterval('crossfade()', 5000);를 사용하여 - 그것은 eval() D로 문자열을 만듭니다. 크로스 페이드 기능이 존재하지 않도록,

setInterval(function() { crossfade(); }, 5000); 
+6

나는 setInterval (crossfade, 5000)을 사용합니다. – Nosredna

1

글로벌 범위를 오염을 방지하기 위해, 당신은 몇 가지 수행 할 수 있습니다 :

  • 는 jQuery를 확장 당신은 폐쇄 함수에 대한 참조를 포함하는 생성되도록 익명의 기능을해야 이미 jQuery를 사용하고 있기 때문이다. (네임 스페이스로 jQuery를 사용하십시오.)
  • 메소드를 보유 할 단일 오브젝트를 작성하십시오.
2

setInterval에 문자열이 전달되면 문자열의 전체 범위가 평가됩니다. 따라서 setInterval이 발생하면 crossfade이 보이지 않습니다.

setInterval 또한 함수 참조를 전달할 수 있습니다 : 예상대로 crossfade 당신이 setInterval를 호출 시점에서 볼 수 있기 때문에

setInterval(crossfade, 5000); 

이 경우 코드가 작동합니다.

+0

그래, 나는 이것을 시도했지만 따옴표와 함께 호출되지 않는 것에 대해서는 오류가 발생한다. –

+0

선호하는 방법은 따옴표없이입니다. 정확히 어떤 오류 메시지를 받았습니까? – Nosredna