Titanium中的自执行功能

时间:2012-01-29 21:12:59

标签: design-patterns titanium javascript

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;
  };
})();

据我所知,自动执行函数非常适合保持全局命名空间清洁,因为函数有自己的范围。但是为什么你会在自动执行函数中声明一个函数,那有什么好处呢?

2 个答案:

答案 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中的变量,因此有理由将其声明为...