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

使用全局属性是通向意大利面条代码的快捷票。您的整个应用程序应该尽可能少地存在于全局对象中的元素中,理想情况下只有一个。

从长远来看,这更加优雅和安全。

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 回答