2015-01-09 2 views
3

더 나은 질문 제목을 가져올 수 없습니다. 죄송합니다.자바 스크립트 전역 모듈 또는 전역 변수

/*! https://mths.be/he v0.5.0 by @mathias | MIT license */ 
;(function(root) { 

    //...omitted 

    var he = { 
     'version': '0.5.0', 
     'encode': encode, 
     'decode': decode, 
     'escape': escape, 
     'unescape': decode 
    }; 

    // Some AMD build optimizers, like r.js, check for specific condition patterns 
    // like the following: 
    if (
     typeof define == 'function' && 
     typeof define.amd == 'object' && 
     define.amd 
    ) { 
     define(function() { 
      return he; 
     }); 
    } else if (freeExports && !freeExports.nodeType) { 
     if (freeModule) { // in Node.js or RingoJS v0.8.0+ 
      freeModule.exports = he; 
     } else { // in Narwhal or RingoJS v0.7.0- 
      for (var key in he) { 
       has(he, key) && (freeExports[key] = he[key]); 
      } 
     } 
    } else { // in Rhino or a web browser 
     root.he = he; 
    } 

}(this)); 

그리고 당신은

<script src="he.js"></script> 

으로 귀하의 페이지에이를 가져올 경우 호출 할 수 있습니다 :

내 질문 https://github.com/mathiasbynens/he/blob/master/he.js에 따라 he.js, 그들은 다음과 같은 코드를 사용하고있다 페이지의 메소드는 he.encode(...)입니다.

제 질문은 정확히 변수가 he으로 설정되어 있습니까? 내 말은

, 나는

} else { // in Rhino or a web browser 
     root.he = he; 
    } 
}(this)); 

그러나 }(this));의 통화에서 정확히 this는 무엇입니다 볼 수 있습니까?

+1

'this'는'window' 일 것입니다 -'window' 인 함수를 실행할 때'this' 인스턴스 – Catalin

+0

@RaraituL 오, 알 겠어! 고맙습니다. 나는 그것이'문서'또는 뭔가일지도 모른다고 생각했다.'창 '을 생각하지 않았다. 다시 한 번 감사드립니다! – EpicPandaForce

+0

he.js가로드되면 익명 함수 (파일의 최상위 레벨 {} 사이의 모든 것)가 정의됩니다. 그런 다음 window 객체를 전달하여 해당 함수를 호출합니다. '(this));을 실행하면됩니다. – erandac

답변

4

의 단순화하자

;(function(root) { 
    ... 
}(this)); 

그래서, 우리는 root라는 인자를받는 함수가 있습니다. 이 함수는 즉시 호출되며 (http://benalman.com/news/2010/11/immediately-invoked-function-expression/) 값 this이 전달됩니다.

여기에서 this은 전체 개체입니다. 브라우저를 사용하는 경우 전역 객체는 window이됩니다.

그래서, 당신은 실제로 브라우저를 사용하는 경우 :

root.he = he; 

것은 실제로 동일합니다, 우리는 반드시 브라우저를 사용 할 필요가 없습니다

window.he = he; 

그리고 노트, 감사 Node와 같은 플랫폼에는 이제 this 전역 객체가 window이 아닌 다른 컨텍스트가 있습니다. 그래서 다른 하나는 명시 적으로 window을 지정하지 않고이 특정 연습을 진행합니다.

+0

이것은 멋지다! 나는 전에'var globalVariable = (function() {)}();'을 사용했지만,'this'를 건네 주면 전역 상수를 사용하는 것보다 더 귀엽습니다. – EpicPandaForce

관련 문제