0

我有以下代码来自创建 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 的对象。在返回对象之前将变量放入方法定义时是否转换为其值。或者它是否继续引用我认为在函数返回后会被销毁或至少超出范围的自执行函数中创建的变量?

非常感谢您提前提供的帮助,我已经尝试了几次实验,看看我是否可以用一种或另一种方式证明它,并且也仔细看看,虽然我有点不确定要搜索什么。

4

1 回答 1

0

我发现这个问题的答案是闭包

当自执行函数完成执行时,该变量不会被销毁,因为创建它的环境也将包含在闭包中。

于 2013-06-25T11:52:55.947 回答