2013-03-28 2 views
0
(function($) { 

    var foo = (function(){ 

     //some functions 

    })(); 

    // I can access foo here 
    var f = new foo(); 

})(jQuery); 

// But obviously not here since it's in another scope 

어떻게, 윈도우 범위에 foo을 반환합니까? return foo;을 시도했지만 작동하지 않았습니다.다른 함수에서 자동 실행 기능 (인생)을 반환

답변

3

단순히 윈도우 속성으로 설정 :

(function($) { 

    var foo = (function() { 

     // some functions 

    })(); 

    window.foo = foo; 
// ^^^^^^^^^^^^^^^^^ 

})(jQuery); 

foo(); 

을하지만, 일반적으로 멸시하는 window 객체의 속성으로 전역 개체를 설정. 아마도 사용자 정의 "전역"객체를 관리하여이 기능을 에뮬레이트 할 수 있습니다. 예 :

var global = {}; 

(function($) { 

    global.foo = (function() { 

     // define 

    })(); 

})(jQuery); 

global.foo(); 

그런 식으로 다양한 범위와 개체를 처리 할 때 이름 충돌이 발생하지 않습니다.

+0

감사합니다. 왜 그런 생각을하지 않았습니까? – Johan

+0

두 번째 코드 조각에 관해서; 아직도 내가 창을 얻는다는 것을 의미 할거야. 세계. 푸우, 그렇지? 차이가별로 없습니다. – Johan

+0

@Johan 아니, 그렇지 않으면 그냥 '글로벌'로 간주됩니다. 'var' 키워드없이 정의했다면 윈도우 객체의 전역 변수가됩니다. 이 경우에는 아닙니다. – 0x499602D2

1

글로벌 속성 사용은 스파게티 코드의 특급 항공권입니다. 전체 응용 프로그램은 전역 객체에서 가능한 한 적은 요소로만, 이상적으로는 하나만 사용해야합니다.

이것은 훨씬 더 우아하고 장기간 안전합니다.

var MYAPP = {}; //declaring with var is not necessary here, but it's good to keep constant. 

MYAPP = (function($, MYAPP) { 

    var foo = (function(){ 

     //some functions 

    })(); 

    // enrich your object 
    MYAPP.foo = foo; 
    return MYAPP; 

})(jQuery, MYAPP); 

그리고 나서 "풍부한"MYAPP 개체를 사용할 수 있습니다.

MAYPP.foo(); 

이와 비슷한 패턴이 JavaScript의 God : Douglas Crockford에 의해 제안되었습니다.

+0

의견을 주셔서 감사합니다. 내 경우에는 비록 그것은 단지 창 개체에 하나의 속성이 될 것입니다. MYAPP 또는 foo라면 정말 중요합니까? 내 말은, 창문에 적어도 하나의 속성이 붙어 있는거야, 그렇지? – Johan

+0

적어도 window의 속성은 하나 여야합니다. 물론 그 중 하나만 필요하면 문제는 아니지만 프로그램에서이 작은 "나는 한 번 해보겠다"는 것은 프로그램이 성장하고 공을 차는 때 항상 당신에게 돌아온다는 것입니다.foo 만 필요하다하더라도 전역 변수에'var foo; '를 선언하고 자동 실행 함수의 반환 값으로 할당 할 것입니다. 이 방법을 사용하면 프로그램이 5k 라인 길이 인 경우에도 어디서 왔는지 알 수 있습니다. 이상한 의존성을 허용하지 말고 깨끗하게 유지하십시오. – bgusach

+0

전적으로 동의합니다. 입력 해 주셔서 감사합니다! – Johan

관련 문제