2013-10-16 2 views
0

모듈 패턴을 사용하여 개발 중이었고 왜 이것을 사용하여 모듈 범위에 액세스 할 수 없는지 궁금합니다. 어쩌면 내가 드러나는 모듈 패턴에 대한 이해가 잘못되었을 수도 있습니다. 여기 자바 스크립트 모듈 패턴 범위 this with

내가 사용하는 코드입니다 :

var BLOG = window.BLOG || {}; 

BLOG.Module = (function(){ 

    var 
     _this = this, 
     _hasLoaded = false; 


    function init(){ 
     console.log(_this); // Logs the Window object 

    } 


    function _privateMethod(){ 
     $.ajax({ 
      url: 'lazyload/lazyload.html', 
      success : function(data){ 
       // _hasLoaded = true; // I want to access the variable in my module, How do I refer to it? 
      } 

     }); 
    } 


    return { 
     init : init 
    }; 

})(); 
+0

무엇 당신이'this'에 참조 할입니까? 예를 들어 줄 수 있습니까? –

+0

내가 원하는 것을 아약스 성공에 추가했습니다. _hasLoaded 변수에 액세스하여 true로 설정하고 싶습니다. – arlg

+0

@ arlg : 그냥'_hasLoaded = true;'_privateMethod'를 사용하면 아약스 성공 핸들러는 모두 해당 변수에 대한 클로저입니다. 내 대답을 세부 정보로 업데이트했으며 유용한 링크가 될 수 있습니다. –

답변

3

this는 함수가 호출되는 방식에 의해 결정된다. 객체 속성 (외부 범위 지정 함수)을 통하지 않고 직접 호출 한 경우 해당 호출 내에서 this은 느슨한 모드의 전역 객체 (엄격 모드의 경우 undefined)가됩니다. 브라우저에서는 창 개체입니다.

일반적으로 this을 사용하여 가장 바깥 쪽 범위 지정 기능 내의 내용을 참조하려고하지 않습니다 (이러한 이유로).

일이 그랬다면 :

BLOG.Module.init(); 

... 다음 init, this (안 _this)에 대한 호출 내에서 Module을 참조 것이며, 당신은 당신이 마지막에 만든 개체의 다른 속성을 참조 수를 가장 바깥 쪽 범위 지정 기능 (현재 다른 어떤 것도 없습니다. 단지 init).

var 
    _this = this, 
    _hasLoaded = false; 

// ... 

function _privateMethod(){ 
    $.ajax({ 
     url: 'lazyload/lazyload.html', 
     success : function(data){ 
      // _hasLoaded = true; // I want to access the variable in my module, How do I refer to it? 
     } 

    }); 
} 

그냥 주석이 행 : 당신의 편집 다시


_hasLoaded = true; 

이 모두 _privateMethod_privateMethod를 호출의 결과로 생성 된 아약스 성공 핸들러 폐쇄이기 때문이다 가장 바깥 쪽 범위 지정 함수에 정의 된 변수에 대한. 그래서 당신은 그 (것)들을 직접적으로 참조하십시오.

"closure"라는 단어를 익숙하지 않은 경우 걱정하지 마십시오. closures are not complicated. 그것은 전역 범위에있을 필요가 없습니다 그 코드를 전역 범위에있을 것을 요구하는 코드가 믹스로 ...

var BLOG = window.BLOG || {}; 

:


사이드 참고 :이 이상한 구조입니다 . 그것은 완전히 기능적이며 조금 이상합니다. 아마 방법은 하나 또는 다른 가고 싶어요 :

// Requires that it's at global scope (and yes, this does work) 
var BLOG = BLOG || {}; 

또는

// Creates a global whether it's at global scope or not 
window.BLOG = window.BLOG || {}; 
+0

답장을 보내 주셔서 감사합니다. init에 console.log (this)를 사용하면 init 함수가 생기지 만 모듈은 얻지 못합니다. – arlg

+0

@arlg : 다시 말하지만, 호출 방법에 따라 다릅니다. 'BLOG.Module.init()'를 호출하면'init' 내에'this'가'BLOG '가됩니다.Module' (범위 지정 함수에서 반환하는 객체)입니다. –

+0

@arlg : 질문을 올리 자마자 물어봤을 때 질문에 답하면 정말 도움이 될 것입니다 (질문 아래의 주석 참조). –

관련 문제