Tweetanium,一个Titanium项目被广泛引用为Titanium中最佳实践的指南:https://github.com/appcelerator-titans/tweetanium几乎在所有地方使用自执行函数,即使是在此视图中的函数声明:
(function() {
//create the about view
tt.ui.createAboutView = function(_args) {
var aboutView = Ti.UI.createView($$.stretch);
aboutView.add(Ti.UI.createLabel(tt.combine($$.headerText, {text:L('about')})));
aboutView.add(Ti.UI.createView({
top:$$.headerView.height,
bottom:0,
right:0,
left:0,
backgroundImage:'images/about_mock.png'
}));
return aboutView;
};
})();
据我所知,自动执行函数非常适合保持全局命名空间清洁,因为函数有自己的范围。但是为什么你会在自动执行函数中声明一个函数,那有什么好处呢?
答案 0 :(得分:2)
很多原因......
保持您的代码清洁,可调,灵活,可扩展等...通过添加或删除部分代码来实现。
你可以检查像Mootools(core-builder)这样的库,jQuery可以提供其他类似“捆绑”的库。
这些捆绑包经常可以“按原样”使用,而不包含其他捆绑包(非核心捆绑包)。但是它们还提供了可以在加载时使用的功能和方法。就像这里一样,这个代码将createAboutView编写给应用程序。
所以你有(function(){//核心代码})(); (function(){//模块一个代码,带有自己的工作/流程函数})(); (function(){//模块二,带有自己的工作/过程功能})();
第一单元独立于模块二。他所需要的只是核心(有时是必需的模块)和他自己的范围。
---更新
模块二需要一些功能才能工作。但是核心或模块不需要这些功能,仅在第二个模块范围内。
另一个重要原因是当你宣布一些取决于当前进程的功能时。 This topic显示为什么你有时必须定义函数(它可以是递归的,函数函数到函数中以保持范围和状态)。
小例子:
var a = [], j, k;
(function() {
var i;
for(i = 5; i--;)
a[i] = function() { alert(i); };
})();
for(k = 0, j = a.length; k < j; k++)
a[k]();
在这种情况下,我总是-1,因为当我调用该函数时,我在自执行函数上引用i,由于循环,现在它处于'-1'。
在下面的例子中
var a = [], j, k;
(function() {
var i;
for(i = 5; i--;)
(function(i) { a[i] = function() { alert(i); }; })(i);
})();
for(k = 0, j = a.length; k < j; k++)
a[k]();
OR
var a = [], j, k;
(function() {
var i;
var alerti = function(i) {
return function() { alert(i); };
};
for(i = 5; i--;)
a[i] = alerti(i);
})();
for(k = 0, j = a.length; k < j; k++)
a[k]();
在自执行函数中创建函数(或其他自执行函数)允许我保留范围
答案 1 :(得分:0)
好处可以是可读性,将代码分成多个功能,几乎总是被认为是一种好的做法。
无论如何,在示例中,您将自执行函数中包含的函数存储为全局变量tt.ui.createAboutView
中的变量,因此有理由将其声明为...