Firefox 拡張機能の作成に関するチュートリアルの以下のコードがあります。
これは、オブジェクトを作成して割り当てる方法を使用しており、これまでに見たことのないものであり、一部のコードは、JS がどのように適切に機能するかを理解していたにもかかわらず、私を混乱させました。
var linkTargetFinder = function () {
var prefManager = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
return {
init : function () {
gBrowser.addEventListener("load", function () {
var autoRun = prefManager.getBoolPref("extensions.linktargetfinder.autorun");
if (autoRun) {
linkTargetFinder.run();
}
}, false);
},
run : function () {
var head = content.document.getElementsByTagName("head")[0],
style = content.document.getElementById("link-target-finder-style"),
allLinks = content.document.getElementsByTagName("a"),
foundLinks = 0;
if (!style) {
style = content.document.createElement("link");
style.id = "link-target-finder-style";
style.type = "text/css";
style.rel = "stylesheet";
style.href = "chrome://linktargetfinder/skin/skin.css";
head.appendChild(style);
}
for (var i=0, il=allLinks.length; i<il; i++) {
elm = allLinks[i];
if (elm.getAttribute("target")) {
elm.className += ((elm.className.length > 0)? " " : "") + "link-target-finder-selected";
foundLinks++;
}
}
if (foundLinks === 0) {
alert("No links found with a target attribute");
}
else {
alert("Found " + foundLinks + " links with a target attribute");
}
}
};
}();
window.addEventListener("load", linkTargetFinder.init, false);
私の質問は、自己実行関数で変数 prefManager を作成した場所です。次に、変数 linkTargetFinder に割り当てるオブジェクトを返します。オブジェクトが返される前に変数がメソッド定義に配置されたときに、その値に変換される変数です。それとも、関数が戻った後に破棄されるか、少なくともスコープ外になると思っていた自己実行関数で作成された変数を参照し続けますか?
何を検索すればよいかわかりませんが、何らかの方法でそれを証明できるかどうかを確認するためにいくつかの実験を試みました。