2010-03-05 61 views
7

命名空間曾經是ECMAScript(舊的ECMAScript 4)的考慮因素,但被取出。至於布蘭登·艾克說,在this message爲什麼從ECMAScript中刪除名稱空間?

其中一個用例在 ES4命名空間是早期綁定(使用命名空間 固有的),無論是性能和 的程序員理解 - 運行時名稱沒有 機會綁定 不同意任何較早的 綁定。但是,在任何 動態代碼加載場景(如 )中的早期綁定,Web需要預先確定優先級或 預留機制,以避免早期對比後期綁定衝突 。

另外,像一些JS實現者 關切地注意到,多個打開的
命名空間強加運行成本,除非 實現工作
顯著困難。

由於這些原因,命名空間和 早期綁定(像之前的包
他們,今年4月)必須去。

但我不確定我是否理解這一切。究竟什麼是優先或預約機制,爲什麼需要這些機制?另外,早期綁定和命名空間必須攜手並進嗎?出於某種原因,我無法圍繞所涉及的問題進行討論。任何人都可以嘗試更加充實的解釋嗎?

此外,名稱空間爲什麼會強加運行時成本?在我看來,我不禁感到命名空間和使用閉包的函數在概念上沒有什麼區別。例如,雅虎和谷歌都擁有YAHOO和谷歌對象,這些對象「充當」命名空間,因爲它們包含了所有公共和私有變量,函數以及單個訪問點中的對象。那麼,爲什麼命名空間在實現上會有如此大的不同呢?也許我只是對命名空間到底是什麼有個誤解。

因爲我想賞金着想知道兩件事情:

  1. 是否命名空間需要早期綁定?
  2. 名稱空間實現 與具有 私有成員的對象有什麼不同?

回答

2

如果在函數的定義將調用該變量之後在閉包中聲明變量,它仍會使用該作用域變量。

function ShowMe() { 
    alert(myVar); //alerts "cool" 
} 

var myVar = "cool";

這個過程會給命名空間帶來一層複雜的問題。

除此之外,還有許多名稱空間方法以及expand/applyIf等可以完成許多相同的功能。例如ExtJS中的namespace(),或者jQuery中的$ .extend。所以,在語言的結構中可能有一個好的,但不是絕對的需要。我認爲在Array中對Array的一些擴展進行形式化,並支持Date中的ISO-8601日期,這本身就更爲重要。無需簡單地檢查每個名稱空間圖層的定義...

window.localization = $.extend(window.localization || {}, { 
    ... 
}); 

window.localization.en = $.extend(window.localization.en || {}, { 
    ... 
});
+0

我也認爲有更重要的事情要關注,但我問了這個,因爲我不明白給出的原因。這裏也給出了ECMAScript中名稱空間模擬的例子,所以我更加困惑爲什麼命名空間是一個壞主意 – Bob 2010-03-09 15:10:51

1

行第一一些術語:

  • 早期綁定 - 檢查/時的代碼行被解析驗證。
  • 延遲綁定 - 執行代碼行時檢查/驗證。
  • 優先/預約 - 我認爲他們的意思是,如果你做早期綁定,並檢查命名空間的代碼解析必須有驗證當變量是動態添加稍後變量名和一組不同的過程規則是什麼是有效的,因爲在這一點上可能涉及幾個範圍。

我很驚訝,只有這些相當技術性的原因。以普通情況: -

onclick=' var mymark = "donethat";' 

「mymark」應屬於哪個名稱空間?這個問題似乎沒有任何簡單的答案。特別是考慮到代碼片段: -

window.forms.myform.mybutton.onClick = ' var mymark = "donethat";' 

應該把變量放在同一個名字空間中。

相關問題