2013-02-20 19 views
2

我是一名熟練的C/C++程序員,他必須在JavaScript中實現Firefox擴展(對我而言,這是一種令人不快,不直觀的語言)。我有擴展基礎工作,但現在我需要將我所有的全局變量和函數放到一個名稱空間中,以確保我的變量名或函數名不會與任何過去/現在/將來的全局/窗口對象中可能存在的名稱衝突,或者在另一個擴展中。函數可以在javascript中單獨聲明和定義(創建Firefox擴展)?

用我的全局變量創建一個名稱空間對象看起來簡單而直接,並且工作正常。

我無法理解的是如何將我的函數的聲明放入名稱空間對象中,然後在名稱空間對象聲明下實現所有這些函數。這可以用一些合理的乾淨語法來完成......像下面這樣的東西?

// 
// declare namespace 
// 
var mynamespace = { 
    varname00: value, 
    varname01: value, 
    varname02: value, 
    function: funcname00(), 
    function: funcname01(number), 
    function: funcname02(number, string), 
}; 
// 
// define functions 
// 
mynamespace.funcname00() { 
    return (23); 
} 

mynamespace.funcname01(number) { 
    return (number * number); 
} 

mynamespace.funcname02(number, string) { 
    econsole.logStringMessage("funcname02() : " + string + number); 
    return (number); 
} 

注意:我的目標不是棘手或高級的 - 恰恰相反!我正在尋找一種能夠儘可能直觀地感受C程序員的技術!因此我更喜歡:

1:在頂部只創建一個聲明變量和函數的名稱空間對象的小聲明。

2:在全局名稱空間對象之外實現函數。

由於JavaScript語法規則完全混淆,我猜測javascript可能會讓我插入命名空間對象聲明中的所有函數定義/實現。對我來說這很糟糕,但如果這是唯一可行的方式,我必須忍受這一點。但對我個人來說,擁有一個如此巨大的區塊幷包含「一切」是非常重要的,所以如果可能的話,我寧願避免這樣做。

注意:這不是徵求關於程序風格的意見 - 完全相反。我只想知道實際上與我在上面示例中展示的傳統C語法/佈局最相似的JavaScript語法。如果與我的示例最接近的javascript語法/佈局在某種程度上緩慢,低效或功能有問題,我很樂意提供有關執行效率的評論。謝謝。

+1

有沒有這樣的概念,如JavaScript函數原型。函數是同時聲明和實現的。您最初可以在工作空間中將一些屬性設置爲「null」,並稍後將函數分配給它們,但語義仍然不同。 – 2013-02-20 08:55:02

+1

a)JS不需要類型簽名聲明,也沒有名稱空間聲明b)「名稱空間」只是具有屬性的對象,您需要爲其分配函數(或在對象文本中正確定義它們)。 – Bergi 2013-02-20 08:57:00

+0

從上面的註釋中可以看出,雖然JavaScript沒有「函數原型或聲明」,但是存在一些可行的語法,它們會對我的示例進行分類。那是對的嗎?語法是什麼樣的? – honestann 2013-02-20 09:06:24

回答

3

最接近於要實現將初始化函數成員null在您的命名空間的對象是什麼語法:

var mynamespace = { 
    varname00: value, 
    varname01: value, 
    varname02: value, 
    funcname00: null, 
    funcname01: null, 
    funcname02: null 
}; 

然後指定函數表達式這些成員,例如:

mynamespace.funcname02 = function(num, str) { 
    econsole.logStringMessage("funcname02() : " + str + num); 
    return num; 
}; 

請記住,這些函數不會被掛起,這意味着它們不能被位於名稱空間聲明和其實現之間的代碼調用。

這是常見的款式在Javascript直接在命名空間中定義函數:

var mynamespace = { 
    varname00: value, 
    varname01: value, 
    varname02: value, 
    funcname02: function(num, str) { 
     econsole.logStringMessage("funcname02() : " + str + num); 
     return num; 
    } 
}; 
+0

謝謝,這就是我一直在尋找的。儘管第一種方式對我來說更直觀,但我認識到您展示的通用風格的好處。也許我可以容忍在我的唯一命名空間對象中的JavaScript程序中包含所有東西(如果額外的意圖不會讓我瘋狂)。問題:兩個公式中的變量是否可以直接訪問(如「varname00」與「mynamespace.varname00」)? – honestann 2013-02-20 09:27:02

+0

@honestann,nope,除非您使用[with](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with)聲明,否則您將不得不使用其限定名稱不推薦使用(並且在嚴格模式下不可用)。 – 2013-02-20 09:31:15

相關問題