信息
我正在尝试构建一个网站,我可以在其中包含某些文件,并使用不同的方法附加到我的全局变量,这些方法只会轻松添加到对象中。含义我只需要包含文件,此页面现在可以访问hutber对象中的所有内容。
核心hutber.js
var hutber = {};
(function ($) {
"use strict"; //For good development standards :)
hutber.init = function(){
};
hutber.init();
})(jQuery);
额外位hutber.form.js
(function ($) {
"use strict"; //For good development standards :)
hutber.form = {
}
});
问题
我知道hutber
在封闭内无法访问hutber.form
。因此,如果不将这些功能从自动执行功能中删除,我如何才能hutber
访问hutber.form
?
或者这只是完全错误的方法来解决这个问题?
答案 0 :(得分:4)
不可以访问hutber.form
,因为hutber
是全局的,但问题是时机问题。
如果init()在执行hutber.form
函数之前运行,它将不存在。初始化无法运行到所有“加载项”都已加载。
附注:您的第二个将无法运行,因为它没有(jQuery);
。
(function ($) {
"use strict"; //For good development standards :)
hutber.form = {
}
}); <-- missing (jQuery); so it is not going to do anything
运行一个小小的演示,看看会发生什么。
var myObj = {};
(function(){
myObj.init = function(){
alert("init");
try{ //will fail since bar has not loaded yet
myObj.bar();
} catch(e){ alert("failed calling bar"); }
};
//call init before bar is loaded
myObj.init();
})();
(function(){
myObj.bar = function(){
alert("bar");
};
})();
//call init after bar has been loaded
myObj.init();
当你运行它时,你会看到init在第一次调用时会失败,因为bar没有加载。第二次添加方法后它将起作用。因此,如果init依赖于加载的“模块”,它需要知道何时加载它们才能调用init方法。
答案 1 :(得分:1)
我想你想要这个:
<script src="hutber.js"></script>
<script src="hutber.form.js"></script>
<script> hutber.init(); </script>
答案 2 :(得分:0)
看看如何将hutber定义为全局变量,“form”属性肯定可以在任何立即调用的函数表达式中访问。
答案 3 :(得分:0)
你可能会以错误的方式看待这个问题。
不是说立即调用的函数是构建功能的错误方法......
然而,我所说的是,你有一个全局可用的对象,你可以在你的函数中直接引用它...
分配hutber.form = {};
后,全局范围内的所有内容都可以完全访问hutber.form
,因为hutber
可以全局访问。
如果你这样做,那真的没有什么不同:
//form.js
hutber = hutber || {};
hutber.form = { /* ... */ };
在公众访问hutber.form
方面。
闭包涵盖了你不返回的东西以及你没有分配给外部范围内的对象/数组/变量的东西。
因此,如果您在闭包内部有var mySecretIdentity = "Jerry O'Connell";
,那么只有hutber.form
内的方法才能访问mySecretItentity
...
...但是,你可以通过以下方式完成同样的事情:
// form.js
hutber = hutber || {};
hutber.form = (function () {
var mySecretIdentity = "Jerry O'Connell";
return {
submit : function () {},
clear : function () {},
validate : function () {}
};
}());
现在任何私有都只能通过在闭包内写入的函数直接访问。
再说一次,它归结为:“你想解决什么问题?”
答案 4 :(得分:0)
{@ 1}}标签顺序非常重要,如@Sime Vidas所述。
按以下顺序执行:
<script>
我修改了jsFiddle中的脚本。你会注意到我喜欢使用window.variable来明确全局变量。我在核心hutber.js文件中的init函数立即触发,如果这是你想要的。
<script src="hutber.js"></script>
<script src="hutber.form.js"></script>