2010-04-15 103 views
2

我是一名新的程序員,我從C開始,現在開始享受JavaScript和更多的PHP。最近我聽說「私人」和「公共」這兩個詞的功能很多。任何人都可以解釋這兩者以及它們對程序員的用途嗎?私人和公共職能有什麼區別?

而且我可能是完全錯誤的......在這裏不過是一個

(function(){}) 
在JavaScript私有函數

+3

'function(){}'是一個匿名函數。 – Gumbo 2010-04-15 19:51:29

+0

Oh dang!我有很多要學習! – 2010-04-15 20:05:38

回答

11

術語「公共」和「私人」在Javascript中並不適合。關鍵是這樣的:你有辦法引用你知道存在的某個函數嗎?也就是說,你可以通過名稱來引用它(直接或作爲另一個可以引用的對象的屬性)?如果是這樣,恭喜,您可以調用該函數。如果不是,那麼你不能。

這意味着該功能的「公共性」不是一個靜態的東西,因爲它是在像Java或C考慮:

var x = (function() { 
    function maybePrivate() { return "my privates!"; } 

    return { 
    getMyPrivates: function() { 
     var rv = maybePrivate; 
     this.getMyPrivates = function() { return null; }; 
     return rv; 
    } 
    }; 
})(); 

奇怪。所以現在「x」是一個對象,你可以看到裏面有一個「maybePrivate」函數。但是,那個名字—「maybePrivate」—對你沒有任何好處,因爲從以外 x你不能使用名稱來獲得該函數。

然而,奇怪的對象有另一個功能,被稱爲「getMyPrivates」,你可以得到它。當你調用它時,你會回到對「maybePrivate」函數的引用,然後可以使用它來調用該函數。現在,「maybePrivate」仍然是私人的嗎?那麼,如果你這樣做:

alert(x.getMyPrivates()()); 

你會看到「我的私人!」信息。所以它看起來像「maybePrivate」不再那麼私密。但是,如果您再次嘗試,則它不起作用,因爲「getMyPrivates」會在第一次調用它後自行排除它。

那個穿過鏡子的小旅程就是爲了說明Javascript是動態的。唯一真正「靜態」的是,一旦你封閉了一個閉包內的函數(如上例中的「maybePrivate」),你不能強迫它從外部對象(至少,而不是沒有經歷一些真正曲折的扭曲;語言是如此的糊塗,以至於聲稱某些東西是「不可能」是危險的:-)。這個例子中的對象可以選擇揭示其「私人」的東西,但它也可以選擇不要。

+3

+1對於方法名稱x.getMyPrivates(),我是 heheh。 – leeand00 2010-04-15 20:10:14