2011-10-31 83 views
0

我正在尋找在互聯網上的良好JS實踐,發現一個有趣的(可悲的是,我並不完全明白)需要幫助瞭解如何與命名空間來工作:(

myNameSpace = function(){ 
    var current = null; 
    function init(){...} 
    function change(){...} 
    function verify(){...} 
    return{ 
    init:init, 
    change:change 
    } 
}(); 
  • 我在哪裏可以使用這個名稱空間?
  • 我怎樣才能使用的名稱步伐?
  • 是不是真的好主意,而不是使用全球呢?

腳本來源:http://dev.opera.com/articles/view/javascript-best-practices/

+0

我認爲所有這些問題都在文章中得到解答。 – Blender

+0

你好Blender,不幸的是,文章假設你已經掌握了JS,所以他們不解釋它,因爲我想 – ajax333221

+1

*工作地點*和*工作空間*,你的意思是*命名空間*?如果是這樣,你可以編輯你的問題只使用*命名空間*?如果不是,請解釋你的意思。 – stivlo

回答

1

你也可以使用這樣的代碼,它可以讓你編寫OO JavaScript代碼。你應該只將一個單位的內聚函數分組,並根據需要構建更多的對象。

請注意,function buildFullName是一個私有函數,因爲它無法從外部訪問。

我同意你的看法,但以前沒有JavaScript知識。事實是,一個函數是JavaScript中的第一個類Object。你可以在函數中嵌套函數,它們可以有變量,並且有很多方法可以組合它們,但沒有像Java那樣的標準方法。我認爲文章JavaScript Closure 101可以幫助你清理一些東西。

/** This is our Object definition and constructor */ 
function Person(fname, lname) { 
    this.firstName = fname; 
    this.lastName = lname; 
} 

/** Anonymous function to avoid polluting the global namespace */ 
(function() { 

    /** This function will be defined public, we prefix the class name */ 
    function Person_toString() { 
     //call buildFullName passing this, we could also call the function 
     //as buildFullName(), and it would work, but wouldn't have 'this' 
     return buildFullName.call(this); 
    } 

    /** Another public function */ 
    function Person_buildGreeting() { 
     return "Hi " + this.firstName; 
    } 

    /** This function is private! */ 
    function buildFullName() { 
     return this.firstName + " " + this.lastName; 
    } 

    /** Here we augment the Object with public functions */ 
    Person.prototype = { 
     toString: Person_toString, 
     buildGreeting: Person_buildGreeting 
    }; 

})(); //execute the anonymous function immediately 

用法示例:

var p1 = new Person('Jenny', 'Fairview'); 
alert("toString()=" + p1.toString()); 
alert("buildGreeting()=" + p1.buildGreeting()); 
+0

很好的例子,這清除了事情 – ajax333221

0

這是一篇不好的文章,至少是關於避免全局的部分。當你的代碼變得非常大以至於你最終會給它一個前綴時,這些事情就會出現,例如dojo。全部/大多數dojo函數以dojo.開頭,因此當您加載它時,它不會覆蓋您的函數(當然,這裏假設您沒有函數或變量dojo)。

如果你在表單

function init(){...} 
function run(){...} 
function start(){...} 

1000層的功能,他們正在做的理由是,它更容易做到

packageName = function{ 
function init(){...} 
function run(){...} 
function start(){...} 
return { 
    init : init , 
    run : run , 
    start : start 
} 

packageName = function{ 
init : function init(){...} , 
run : function run(){...} , 
start : function start(){...} 
} 

我更喜歡後者。它更乾淨,更簡潔,不易混淆。

+0

您的首選語法不等同於問題中的語法。問題出現的方式是函數可以很容易地通過名字直接調用對方,並且(可以說更重要的是)'current'和'verify()'是私有的。你的方法也可以是有用的,但是函數不能通過調用'this.functionname()'(可能會根據它們的調用方式而斷開)或使用'packageName'命名空間前綴來調用對方。 (另外,你的意思是'packageName'被分配給一個函數或者一個對象文字嗎?) – nnnnnn

+0

將1000個函數包裝在一起並不是一個好主意,但我認爲你只是寫了pourparler,並不是因爲你的意思是1000.如果可能的話小凝聚力的單位應該更多地在10分。 – stivlo

+0

@nnnnnn這是真的,我沒有考慮 – puk

0

你可以去遠一點和使用CommonJS的或AMD模塊來構建應用程序,並避免全局變量非常乾脆。道場正朝這個方向發展,但還沒有從使用道場遷移。*