0

我正在尝试构建一个 Javascript 库,该库将为我正在组合的 JQuery 插件提供一些功能。

我从网上搜索得到了以下骨架代码,虽然我不太确定它是如何工作的(我知道它是一个闭包)。我已经通过声明添加了我的函数。

(function(window, document, $) {

    function func_1(){
        return 1;
    }

    function func_2(){
        return 2;
    }

})(window, document, jQuery);

所以我把上面的代码放在一个单独的 JS 文件中,然后在我的 HTML 页面中获取它,然后我运行尝试像这样运行函数(注意:我也设置了 JQuery):

<script type="text/javascript">
        $(document).ready(function() {
            console.log(func_1());
        });
</script>

但是,我似乎在 Firebug ( ReferenceError: func_1 is not defined) 中遇到了一些错误。

我有两个问题:

  1. 我如何调用我的函数?!
  2. 我希望能够以以下格式调用函数:className.functionName(). 我如何重组骨架代码以使我能够做到这一点,例如,像这样调用我的函数:Device.func_1()

感谢您的预期帮助。

4

3 回答 3

2

闭包用于对其余代码隐藏内部函数。您需要显式公开库的公共功能:

var Device = (function(window, document, $) {
    function func_1(){
         return 1;
    }

    function func_2(){
        return 2;
    }

    var internalDevice = {
        func_1: func_1,
        func_2: func_2
    };
    return internalDevice; // expose functionality to the rest of the code
})(window, document, jQuery);

(function(window, document, $) {})(window, document, jQuery);部分称为立即调用函数表达式 (IIFE)。它用于避免将所有库函数泄漏到全局范围内。否则,如果其他一些库有一个func_1函数,它将被覆盖或覆盖你的库的func_1.

函数的参数用于控制库如何影响代码的其他部分并依赖它。例如,有人可能会覆盖 window.$ 库,这样 $ 在代码中的任何地方都不再可用。但是由于您在闭包中有本地引用,您仍然可以访问它。

除了使用上面的代码 - 返回一个对象 - 您还可以将您的库直接分配给全局范围:

(function(window, document, $) {
    ...
    window.Device = internalDevice; // expose functionality to the rest of the code
})(window, document, jQuery);
于 2012-11-14T15:11:58.637 回答
0

我只能回答第二个问题,但你可以这样做:

var Device = {
function func_1()
{
// your first function
},
function func_2()
{
// your second function
}
};

这样你就可以调用:

Device.func_1();

跳有帮助:)

于 2012-11-14T15:10:15.910 回答
0

当某个东西在一个闭包内时,它的作用域就变成了那个闭包。func_1并且func_2只能在调用它们的匿名函数内部和下面看到。

于 2012-11-14T15:12:32.410 回答