2009-08-28 50 views
3

當我創建一個JS命名空間(myNameSpace對象)與公共方法(myPublicMethod)如何調用公共函數在JavaScript namesapce

jsfile1.js

var myNamespace=(function() { 

    var myPublicMethod=function(){ 
    alert("hello world"); 
    } 

    return 
    { 
    myPublicMethod:myPublicMethod 
    }; 

})(); 

,然後有一個單獨的.js文件它封裝它的方法

jsfile2.js

(function(){ 
    myNamespace.myPublicMethod(); 
})(); 

兩個文件是個EN包括在HTML文件

<script src="jsfile1.js"...> 
<script src="jsfile2.js" ...> 

當我嘗試調用myPublicMethod()我得到了myNameSpace不存在的錯誤。這是因爲它封裝在jsfile2.js文件中?

謝謝

+0

你錯過了最關鍵的變化...我已經修訂jimr的答案明確指出。 – Shog9 2009-08-28 23:19:11

回答

7

該功能沒有在您的命名空間中定義的原因是因爲一個隱含分號返回後插入線

return 
{ 
    myPublicMethod:myPublicMethod 
} 

的,所以有什麼解釋實際上看到的是一樣的東西:

所以沒有什麼實際上是從函數返回,並myNamespace值保持undefined。解決方法是簡單:只需將左大括號放在同一行作爲return

return { 
    myPublicMethod: myPublicMethod 
}; 

(注意尾隨分號是嚴格需要,但無論如何是個好主意,如果你曾經計劃使用類似於minifier

另外,您在第一個文件is invalid中定義函數的方式。它應該是

var myNamespace = (function() { 
... 
})(); 
+0

根據你的例子修改,上面的變化,仍然有相同的錯誤。 – ChrisP 2009-08-28 23:05:44

+0

將{移至與返回工作相同的行。 有趣的是,你必須把大括號放在與「返回」相同的行上。似乎與語言的其他方面工作方式不一致。謝謝。 – ChrisP 2009-08-28 23:41:20

1

會將文件1更改爲以下工作嗎?

var myNamespace={ 

    myPublicMethod: function(){ 
    alert("hello world"); 
    } 
}; 
1

你有你的myNamespace函數聲明丟失的圓括號,你也應該在你的回報語句中使用分號:

var myNamespace = function() { 

    var myPublicMethod = function(){ 
    alert("hello world"); 
    } 

    return { 
    myPublicMethod : myPublicMethod 
    }; 
}(); 

myNamespace.myPublicMethod(); 
+0

與答案#1相同,但仍然出現錯誤。 – ChrisP 2009-08-28 23:08:09