2012-06-07 100 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是從對象之外從未訪問。