0

ライブラリを作成していますが、すべての関数が「lib.someFunction();」で呼び出されています。または「lib.someVariable;」。グローバル名前空間を汚染するべきではないことはわかっていますが、ライブラリのユーザーにそのオプションを提供したいと思います。一部のライブラリには「installLibrary();」のような「オプション」があると聞きました。これにより、クラス内のすべての関数と変数がグローバル名前空間に移動します。

このように、ユーザーだけが好むので、「someVariable」を呼び出すことができます。または「someFunction();」直接。

しかし、私の問題は、そのような関数をどのように書くかです。何か案は?

4

2 に答える 2

1

ライブラリでグローバル スペースを汚染しないという明らかな理由は別として、次のようなことができると思います。

注:これは、ブラウザーまたはノード内にいるかどうかを確認するために書いたものです。グローバル名前空間の場合、ブラウザでは「window」、ノードでは「global」を参照できるはずです。

var scope = (typeof window !== 'undefined' ? window : global);
scope.someVariable = true;
scope.someFunction = function() { };

// Essentially, this is the same as:
window.someFunction = function() { };
// or
global.someFunction = function() { };
于 2012-11-28T19:06:41.790 に答える
1

次のようなことができます。

function Library() { 
    this.var = 5; 
    this.otherVar = 4; 
    this.cool = function(x) {
        return x + this.otherVar;
    }
} 
var library = new Library();

(function (lib, context) {
    for (var prop in lib) {
        if (lib.hasOwnProperty(prop) && prop) {
            if (typeof lib[prop] == "function") {
                context[prop] = function() {
                    return lib[prop].apply(lib, arguments);
                }
            } else {
               context[prop] = lib[prop]; 
            }
        }
    }
}(library, this));

ただし、ここで関数以外を使用する場合は注意してください。これを行って、global/window 名前空間のパラメーターを調整しようとすると、パラメーターがライブラリ関数に戻されず、必要な動作が得られない可能性があります。例えば:

library.cool(3);  // 7
cool(3);          // 7
otherVar = 10;
library.cool(3);  // 7
cool(3);          // 7  Still?
library.otherVar = 10;
library.cool(3);  // 13
cool(3);          // 13  Finally!

この制限がない代替手段は、ライブラリ コンストラクター関数をグローバル/ウィンドウ オブジェクトに適用することです。

Library.call(this);

これに関する問題は、パブリック API でグローバル スコープを汚染するだけでなく、途中でローカル クロージャに格納した可能性のあるものも汚染することです。それは私には重すぎるように思えます。

あなたのライブラリが公開モジュール パターンのようなものを使用し、関数のみを公開している場合、最初のパターンは非常に簡単だと思います。しかし、他の人が言ったように、それは賢明ではないかもしれません。せいぜい、これをユーザーのオプションとして提供しますが、それに対して警告します.

于 2012-11-28T20:06:12.183 に答える