4

次のコードを検討してください。

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };
})();

window.myGlobalObj = {
    init: function() {
        // and somehow here I want to  access to the IIFE context
    }
};

グローバル オブジェクトに IIFE の実行コンテキストが必要です。関数式とオブジェクト自体にアクセスできるので、何かを渡したり変更したりして、それを機能させることができます (オブジェクトまたは関数内のすべてを書き直すことはできません)。

それは可能ですか?

4

3 に答える 3

2

それがどのように可能であるかを確認する唯一の方法は、eval動的スコープをシミュレートするために使用することです。これを行います (IIFE はグローバル オブジェクトの後に配置する必要があることに注意してください)。

window.myGlobalObj = {
    init: function() {
        // and somehow here I want to  access to the IIFE context
    }
};

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };

    eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj);
})();

動的スコープの使用方法に関する参考文献は次のとおりです。eval に頼らずに JavaScript で動的スコープを実現することは可能ですか?

編集: JavaScript で動的スコープを使用することの威力を示す例を含めました。フィドルでも遊べます。

var o = {
    init: function () {
        alert(a + b === this.x); // alerts true
    },
    x: 5
};

(function () {
    var a = 2;
    var b = 3;

    eval("(" + String(o.init) + ")").call(o);
}());
于 2012-04-23T11:19:08.120 に答える
2

IIFE の「コンテンツ」、つまり 、aなどsomeFuncは、その関数スコープに対してローカルであるため、そのスコープ内でのみアクセスできます。window.myGlobalObjただし、IIFE 内で割り当てることができます。

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };

    window.myGlobalObj = {
        init: function() {
           // and somehow here I want to  access to the IIFE context
        }
    };

})();

次に、init関数はそれらの変数が含まれているスコープにあるため、それらの変数にアクセスできます。

編集: の定義を IIFE に移動できない場合、myGlobalObj私が考えることができる唯一のことは、IIFE を使用してアクセス元の 2 番目のグローバル オブジェクトを作成することですmyGlobalObj

(function() {
    var a = 5;
    var someFunc = function() { ... };
    function anotherFunc() {
        ...
    };

    // create a global object that reveals only the parts that you want
    // to be public
    window.mySecondObject = {
       someFunc : someFunc,
       anotherFunc : anotherFunc
    };
})();

window.myGlobalObj = {
    init: function() {
        window.mySecondObject.someFunc();
    }
};
于 2012-04-23T10:51:45.493 に答える
0

いいえ、できません。アクセスしたいコンテキストが呼び出さclosureれ、関数内でのみアクセスできます(あなたの場合、匿名関数(IIFEの呼び出し方))。クロージャの詳細については、優れたDouglas Crockfords の Javascript プログラミング言語のビデオ チュートリアル を参照してください。

これらの属性を共有オブジェクトに配置する必要があります。

于 2012-04-23T11:02:56.233 に答える