簡體   English   中英

如何結合匿名功能?

[英]How do I combine anonymous functions?

從SO和其他地方來看,似乎沒有一種擴展匿名功能的方法。 ...但是,請參閱Google在其Google Analytics(分析)(analytics.js)跟蹤腳本中所做的類似操作,但我不確定如何復制相同的內容。

基本上,我有一堆封裝在匿名函數中的方法。 我不希望它們泄漏到全局名稱空間中。

但是...我需要能夠讓用戶選擇加載“擴展”原始腳本的插件(位於單獨的javascript文件中)。 我這樣做是為了使原始腳本盡可能小。 我看不到一種方法,可以將腳本分解為多個文件,然后根據用戶指定的選項即時將其連接在一起,而不會暴露所有方法,以便它們可以進行通信。 但是,這也會使其他人可以使用它們,因此他們可能未按預期使用腳本。

因此,總而言之,我想擁有:

(function() {
// Main.js
....
Based on user input combine with plugin1.js so i can call his methods and he can call mine
})();

(function() {
// Plugin1.js
// More methods
})();

有什么方法或解決方法可以在不暴露我所有方法的情況下完成此任務?

結合使用顯示模塊模式和單個全局名稱空間對象。 像這樣:

//main.js
if (window.MY_APP === undefined) {
    window.MY_APP = {};
}

window.MY_APP.main = (function () {
    //Your code
    var registerPlugin = function() { ... },
        unregisterPlugin = function () { ... };


    return { //Here you expose the functions you want to be public
        registerPlugin: registerPlugin,
        unregisterPlug: unregisterPlugin
    };
}());

//Plugin.js
if (window.MY_APP === undefined) {
    window.MY_APP = {};
}

window.MY_APP.myPlugin = (function() {
    //Plugin code


    return {
       //public methods of plugin 
    };
}());

可能的解決方案

我剛剛想出了一個有趣的解決方案。 這幾乎是自我解釋,我評論了代碼。 希望它能達到目的。

var p1 = (function (self) {
    // private stuff - 
    var hiddenInfo1 = "PlugIn 1's Secret Info";
    var hiddenMethod1 = function () {
        alert(hiddenInfo1);
    }
    // public stuff
    self.exposedMethod = function () {
        alert("PlugIn 1's Public Info");
    }
    self.getPrivateAccess = function () {
        return {
            seal: function () { delete self.getPrivateAccess },
            // - list of shared private stuffs
            hiddenMethod1: hiddenMethod1,
        }
    }
    return self;
})(p1 || {});

稍后您創建一個主/組合

var master = (function (self, p1) {
    // get p1's private stuffs.
    var p1sPrivs = p1.getPrivateAccess();
    // now seal p1 so that no one else can request it.
    p1sPrivs.seal();
    // just to make sure, uncomment this line and get a runtime error. ;)
    // p1.getPrivateAccess();

    // let's define a function for the masses....
    self.shoutAll = function () {
        p1.exposedMethod();
        p1sPrivs.hiddenMethod1();
        alert("Master's Public Method");
    }
    return self;
})(master || {}, p1);

// now use it.
master.shoutAll();

這個想法來自http://www.adequatelygoodgood.com/JavaScript-Module-Pattern-In-Depth.html上的這篇很棒的文章。 特別是進入“ Cross-File Private State

將模塊拆分為多個文件的一個嚴重限制是,每個文件都維護自己的私有狀態,而無法訪問其他文件的私有狀態。 這可以解決。 這是一個松散擴展的模塊的示例,該模塊將在所有擴展中保持私有狀態:

var MODULE = (function (my) {
    var _private = my._private = my._private || {},
        _seal = my._seal = my._seal || function () {
            delete my._private;
            delete my._seal;
            delete my._unseal;
        },
        _unseal = my._unseal = my._unseal || function () {
            my._private = _private;
            my._seal = _seal;
            my._unseal = _unseal;
        };

    // permanent access to _private, _seal, and _unseal

    return my;
}(MODULE || {}));

任何文件都可以在其本地變量_private上設置屬性,其他文件將立即可用。 一旦該模塊完全加載,應用程序應調用MODULE._seal(),這將阻止外部訪問內部_private。 如果要再次擴充此模塊,則在應用程序的生命周期中,任何文件中的內部方法之一都可以在加載新文件之前調用_unseal(),並在執行新文件后再次調用_seal()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM