2012-06-07 101 views
0

我只是想知道为什么在执行javascript模块模式时需要执行自我执行代码。为什么在javascript中执行模块模式时执行自我执行

下面的代码是典型的模块模式样本:

var app = app || {}; 
    app.model = app.model || {}; 

    app.model.person = (function() { 
     var say = function() { 
      alert('say'); 
     }; 

     return { 
      saySomething: say 
     } 
    })(); 

不过,我无法找出为什么这个功能应该与右大括号执行自身的原因。

回答

1

谁说它需要这样实施?我不明白为什么更可读:

var app = app || {}; 
app.model = app.model || {}; 

app.model.person = { 
    saySomething: function() { 
     alert('say'); 
    } 
} 

不能使用...

+0

以封装私有成员,是指http://yuiblog.com/blog/2007/06/12/module-pattern/ – Ray

2

的功能/模块不与右大括号的自我执行,这是自执行(或自我调用)与最后的()

之所以这样做,这是在JavaScript中模仿的隐私。该函数立即执行并返回saySomething函数,该函数在返回后由于关闭而保持可用,因此是公开的。 say函数没有被返回,并且不能在函数之外访问,所以是私人的

+0

我仍然不知道为什么推荐自我执行。如果我让人不是匿名函数而是正常的构造函数,有什么不同?在正常构造函数的情况下,我可以调用saySomething函数,如下所示:var p = new app.model.person(); p.saySomething(); – Ray

+0

与众不同的是,saySomething()函数无处不在,是一个公共成员。自我执行并不总是被推荐,它只是在某些情况下非常有用,比如当你想在JavaScript中模拟隐私时。如果你不关心私人成员和公众成员,那么没有理由使用它。 JavaScript中有很多模式用于实现不同的事情,模块模式只是其中的一种:) – danwellman

+0

隐私,,,即使它不是匿名执行也可以实现。类似于“app.model.person = function(){...}; var p = new app.model.person()”的代码具有与封装相同的结果,不是吗? – Ray

1

在你的例子中,真的没有意义,因为say函数稍后会在返回的对象中公开。但想一想:

app.model.person = (function() { 
    var privateVar = 'I am private'; 

    var say = function() { 
     alert(privateVar); 
    }; 

    var doSomething = function() { 
     // operates on privateVar 
    }; 

    return { 
     saySomething: say 
    } 
})(); 

这是有道理的,因为privateVar是从对象之外从未访问。