2014-04-08 1 views
0

간단한 애드온을 제출하려고 시도하고 다른 애드온 객체와의 충돌을 방지하기 위해 JavaScript 객체 내의 변수 및 함수의 래핑에 대한 AMO 편집기의 메시지를 받았습니다. 사용자가 설치할 수 있습니다. 작업 코드는 매우 간단하고 같습니다JavaScript 객체 내에서 느슨한 변수 및 함수를 랩핑하는 방법

function analyze() { 
    var uri = document.getElementById('urlbar').value; 
    var requrl="http://www.myanalyzingsiteaddress.com/" + (uri); 
    gBrowser.selectedTab = gBrowser.addTab(requrl); 
} 

은 결국 충돌을 피하기 위해 다른 VAR 이름을 만들기 위해 그것을 충분히 아니면 당신이 나를 다른 코드 변경에 지점 수는 AMO 편집기의 명령을 이행 것이다?

미리 감사드립니다.

Evgenij은

답변

0

당신은 XUL 학교 튜토리얼 Javascript Object Management 지적되어 있어야합니다.

analyze은 총칭입니다. 오버레이에는 브라우저 코드 자체와 추가 확장 코드가 공유하는 하나의 범위/네임 스페이스 만 있습니다. 따라서 브라우저 또는 다른 애드온에서 analyze을 사용하고 을 사용하는 것이 가능합니다.

가능한 한 이름을 지정하여 피해야합니다. 예 :

  • function my_addon_id_analyze() ...
  • 는 (의사)의 고유 이름으로 객체를 사용합니다.

    if (!("org" in this)) { 
        this.org = {}; 
    } 
    if (!("example" in org)) { 
        org.example = {}; 
    } 
    org.example.addonid = { 
        analyze: function() ... 
    }; 
    // call 
    org.example.addonid.analyze(); 
    
  • 익명 기능으로 코드를 "숨기"도합니다. 이것은 DOM에서도 숨겨져 있으므로 더 이상 <button id="example.org.addonid.mybutton" onclick="analyze()"> 이벤트 처리가 필요하지 않습니다. 하지만 항상 addEventListener을 사용할 수 있습니다.

    (function() { 
    "use strict"; 
    function analyze() ... 
    // wire up an event handler instead of onlick 
    document.getElementById("example.org.addonid.mybutton").addEventListener("click", analyze); 
    })(); 
    
  • 위, 같은 당신이 피하고 짧은/일반적인 이름의 일부/전부를 혼합 :

    if (!("org" in this)) { 
        this.org = {}; 
    } 
    if (!("example" in org)) { 
        org.example = {}; 
    } 
    org.example.addonid = (function() { 
        function analyze() ... 
        function notvisibleoutside() ... 
    
        // return object of "exported"/"visible" functions. 
        return { 
        analyze: analyze 
        }; 
    })(); 
    // call 
    org.example.addonid.analyze() 
    

을 또한, var 누락 명심 (또는 let/const) 선언은 전역 범위에서 변수를 암시 적으로 선언합니다. 예컨대 :

function abc() { 
    for (i = 0; i < 10; ++i) doSomething(); 
} 

암시 (그러므로이 window.i을 만듭니다 글로벌 범위 window하는 XUL 창에서) 전역에 i라는 이름의 변수를 선언합니다. 따라서 암시 적 선언은 충돌을 야기 할뿐만 아니라 준 메모리 누수를 일으킬 수 있습니다.

function call_me_to_leak_1MB() { 
    hugeArray = new ArrayBuffer(1<<20); 
} 

는 한 브라우저 창 대신에 변수로 즉시 수집 된 쓰레기를 가져 지역 변수를 사용하여 열려있는 생활 범위를 벗어나 window.hugeArray를 선언합니다 (그리고 더 이상 다른 참조는 물론,있다).

strict mode을 사용하면 암시 적으로 오류가 나타나며 이러한 오류를 조기에 발견하고 피하는 데 도움이됩니다.

Javascript 부분이 너무 많습니다. 충돌 할 수있는 다른 것들이 여전히 있습니다.

  • DOM IDS : 고유 한 사용 <button id="example.org.addonid.mybutton">, 또는 그 이상의 CSS 친화적 <button id="example-org-addonid-mybutton"> (또는 addonid-mybutton 같은 적어도 뭔가) 대신 <button id="mybutton">
  • CSS : 전혀 스타일의 임의 요소. button { color: green; }
  • 네 :
    • 없음 #example-org-addonid-mybutton { color: green; }
  • 의 chrome.manifest :
    • 번호 : content generic content/
    • 네 : content example-org-addonid content/.
관련 문제