2011-02-28 4 views
4

필자는 XPCOM 구성 요소를 사용하지 않고 javascript 모듈을 사용하여 첫 번째 FF 확장을 작성하기 시작했지만 jsm이로드 될 때 어떤 일이 발생하는지 모호합니다.Firefox 확장 기능 javascript module : 내포 된 기호는 어떻게됩니까?

Q : 파일 범위가 내보내기되지 않은 기호의 클로저 역할을합니까? 아니면 참조되지 않은 기호가 가비지 수집 된 것입니까?

예를 들어 모듈을 다음과 같이 작성할 수 있습니까?

모듈이이 방법을 쓸 수없는 경우에도
var aNS = {}; 
Components.utils.import("resource://myext/myModule.js", aNS); 
aNS.bar('it works?'); 
alert(aNS.foo()); //alert: 'it works?' 

, 좋은 이유가이되지 않습니다 :

//modules/myModule.js 
var EXPORTED_SYMBOLS = [ 'foo', 'bar' ]; 

var data; 

function foo(){ 
    return data; 
} 

function bar(newData){ 
    data = newData; 
} 

으로 다른 곳에 가져 오기?

답변

3

어딘가에 참조하는 경우에만 폐쇄 방식으로 작동합니다. 잘 살아가 foo.svc 내 cacheService에서 참조 그래서 때문에

var EXPORTED_SYMBOLS = ['foo']; 
let cacheService = Components.classes["@mozilla.org/network/cache-service;1"] 
        .getService(Components.interfaces.nsICacheService); 
let foo = { 
    svc : cacheService, 
    dosomethingwithit : function(){this.svc.somemethod();} 
} 

되어 내 확장에서 내가 좋아하는 뭔가가있다. 내가 어디에서든지 그것을 참조하지 않는다면 쓰레기 수거되었을 것입니다. 누가 상관하지 않을지라도 놀랄 일이 아닙니다.

그러나 이제는 그것에 대해 조금 더 생각해 보았습니다. 왜 이렇게했는지 방황하고 있습니다. 실제로별로 의미가 없거나 차이가 없습니다. 나는 다음과 같은 것을 가질 수 있었다 :

var EXPORTED_SYMBOLS = ['foo']; 

function something(){ 
    this.svc = Components.classes["@mozilla.org/network/cache-service;1"] 
        .getService(Components.interfaces.nsICacheService); 
} 
let foo = new something(); 

나는 첫 번째 접근 방식을 좀 더 좋아한다고 생각한다.

관련 문제