2010-10-01 18 views
0

我試圖定義一種方法,在該方法中,我可以控制對用於工作中的JavaScript(編碼標準改進驅動器的一部分)的方法的訪問。名稱空間中的私有函數javascript

我打算使用的模式很好,直到我想到我們用第三方腳本方法做什麼。

如何調整我的代碼以允許從jQuery方法中訪問私有函數?

var NameSpace = new function() { 

    // My private function I want to access. 
    var privateFunction = function() { 

    }; 

    this.publicFunction = function() { 

     // I can access my private function here. 
     privateFunction(); 

     jQuery(window).resize(function() { 

      // But not here :(
      privateFunction(); 

     }); 
    }; 
}; 
+0

你爲什麼這樣做? – 2010-10-01 16:44:49

+0

從何種意義上說?這是真正的實驗。能夠更好地控制我們生產的javscript會很好。 – 2010-10-01 16:48:35

+0

我不知道,對我來說,將訪問修飾符添加到通常沒有它們的語言聽起來會適得其反。人們指望JavaScript庫沒有它們。 – 2010-10-01 16:51:05

回答

10
// I can access my private function here. 
    privateFunction(); 
    jQuery(window).resize(function() { 
     // But not here :(
     privateFunction(); 
    }); 

當然可以。 JavaScript是靜態範圍的。您可以訪問該調整大小回調中每個封閉範圍的所有變量和函數,包括privateFunction(只要您沒有通過在嵌套範圍中定義privateFunction來遮蔽它)。

你不能做的是訪問封閉函數外的任何局部變量。

我試圖定義一種方法,在該方法中,我可以控制訪問方法,以便在工作中使用JavaScript(編碼標準改進驅動器的一部分)。

我認爲這是毫無意義的練習。

命名空間有助於避免不必要的名稱衝突。真正的「私人」成員是嚴格執行嚴格的安全邊界。但是,這是JavaScript:您不是在這裏運行具有不同訪問級別和沙箱的代碼,就像您可能在Java中一樣。您不必盲目重現JavaScript中的Java安全模型。誰是這裏的「攻擊者」?自己呢?你團隊中的其他編碼員?

數據隱藏和封裝是很好的做法,但您不需要嚴格執行私密性來實現此目的。事實上,擁有真正的私有可能會使調試和原型設計任務變得更加困難。考慮類似Python的方法,您只需標記不應該從外部使用的成員,例如使用前導下劃線。任何使用僞私有成員的人都知道他們正在做一些他們不應該做的事情,並希望有一個很好的臨時原因。

+0

感謝您的意見。非常感激。 – 2010-10-01 17:09:46