自分がよくやるのはこんな感じのやり方です。
コード:
var MyAddonService = {
handleEvent : function(aEvent) {
switch (aEvent.type) {
case 'load': this.init(); return;
case 'unload': this.destroy(); return;
...
}
},
init : function() {
},
destroy : function() {
},
...
};
window.addEventListener('load', MyAddonService, false);
定数にしておきたい物や、関数は、全部このオブジェクトのプロパティやメソッドにしておくというパターンです。グローバル変数を最低一つは使用することになりますが、アドオン名にちなんだ名前にしておけば、まあ、衝突の可能性は避けられるんじゃないかなあと……
また、こうしておくと他のアドオン(自作、他の人の物を問わず)から必要に応じてメソッドを呼び出したり機能を置き換えたりできるので、連携を取りやすいというメリットもあると思っています。
コード:
window['www.example.com'].foo = ...
のような形でより厳密に名前空間を分ける人もいるようですけど、そこまで行くとちょっと冗長すぎるような気もするので、自分はあまり使わないです。
他のアドオンから一切のアクセスを禁止するのであれば、こういう書き方でもいいんですけどね。
コード:
(function() {
var ...
const ...
function ...
})();
これだと名前空間は関数の中だけで隔離されますし、外から変数にアクセスすることもできません。