0
(function($) {

    var foo = (function(){

        //some functions

    })();

    // I can access foo here
    var f = new foo();

})(jQuery);

// But obviously not here since it's in another scope

foo外側の IIFE の外からアクセスできるように、ウィンドウ スコープに戻るにはどうすればよいですか? 試してみましreturn foo;たが、うまくいきませんでした。

4

2 に答える 2

3

ウィンドウプロパティとして設定するだけです:

(function($) {

    var foo = (function() {

        // some functions

    })();

    window.foo = foo;
//  ^^^^^^^^^^^^^^^^^

})(jQuery);

foo();

ただし、グローバル オブジェクトをオブジェクトのプロパティとして設定するwindowことは、一般的に軽視されます。おそらく、独自のカスタム「グローバル」オブジェクトを管理することで、この機能をエミュレートできます。例えば:

var global = {};

(function($) {

    global.foo = (function() {

        // define

    })();

})(jQuery);

global.foo();

そうすれば、さまざまなスコープやオブジェクトを扱うときに名前が衝突することはありません。

于 2013-03-28T21:06:07.197 に答える
1

グローバル プロパティの使用は、スパゲッティ コードへの特急券です。アプリケーション全体は、グローバル オブジェクト内の可能な限り少数の要素、理想的には 1 つだけに存在する必要があります。

これは、長期的にははるかにエレガントで安全です。

var MYAPP = {}; //declaring with var is not necessary here, but it's good to keep constant.

MYAPP = (function($, MYAPP) {

    var foo = (function(){

        //some functions

    })();

    // enrich your object
    MYAPP.foo = foo;
    return MYAPP;

})(jQuery, MYAPP);

そして、「強化された」MYAPP オブジェクトを使用できます。

MAYPP.foo();

これに似たパターンは、JavaScript の神である Douglas Crockford によって提案されています。

于 2013-03-28T21:47:48.207 に答える