我正在尝试构建一个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
)。
我有两个问题:
className.functionName()
。如何重构骨架代码以使我能够执行此操作,并且比如调用我的函数:Device.func_1()
?感谢您的预期协助。
答案 0 :(得分: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
。
函数的参数用于控制库如何影响代码的其他部分并依赖它。例如,有人可能会覆盖窗口。$ library,以便$代码中的所有地方都不再可用。但是由于你在闭包中有一个本地引用,你仍然可以访问它。
除了使用上面的代码 - 返回一个对象 - 您还可以将您的库直接分配到全局范围:
(function(window, document, $) {
...
window.Device = internalDevice; // expose functionality to the rest of the code
})(window, document, jQuery);
答案 1 :(得分:0)
我只能回答第二个问题,但你可以通过这样做来创建:
var Device = {
function func_1()
{
// your first function
},
function func_2()
{
// your second function
}
};
这样你就可以打电话:
Device.func_1();
跳跃有助于:)
答案 2 :(得分:0)
当一个东西在一个闭包里面时,它的范围就变成了那个闭包。 func_1
和func_2
只能在调用它们的匿名函数中看到。