宿主環境(host environment)

  在此前的內容中,我討論的都是JavaScript語言及其規範,而並不是該語言的應用環境。在大多數人看來,JavaScript應用環境都是Web瀏覽器,這也的確是該語言最先的設計目標。然而從很早開始,JavaScript語言就已經在其餘的複雜應用環境中使用,並受這些應用環境的影響而發展新的語言特性了 。編程

JavaScript的應用環境,主要由宿主環境與運行期環境構成。其中,宿主環境是指外殼程序(Shell)和Web瀏覽器等,而運行期環境則是由JavaScript引擎內建的。圖1-8說明由它們共同構建的對象編程系統的基本結構:瀏覽器

 

圖1-8  由宿主與運行期構成的應用環境 服務器

 

1.5.1  宿主環境(host environment)架構

JavaScript是一門設計得相對「原始」一點點的語言,它被創生時的最初目標僅僅是爲Netscape提供一個在瀏覽器與服務器間都能統一使用的開發語言。簡單地說,它原來是想讓B/S架構下的開發人員用起來都舒服那麼一點點的。這意味着最初的設計者但願JavaScript語言是跨平臺的,可以提供「端到端(side to side)」的總體解決方案。ide

然而事實上這很是難於作到,由於不一樣的平臺提供的「可執行環境」不一樣。而宿主環境就是爲了隔離代碼、語言與具體的平臺而提出的一個設計。一方面咱們不能讓瀏覽器上擁有一個巨大無比的運行期環境(例如像虛擬機那麼大),另外一方面服務器端又須要一個較強大的環境,所以JavaScript就被設計成了須要「宿主環境」的語言 。測試

ECMAScript規範並無對宿主環境提出明確的定義。好比說,它沒有提出標準輸入輸出(stdin、stdout)須要確切地實如今哪一個對象中。爲了彌補這個問題,RWC在WebAPIs規範中首先就提出了「須要一個Window對象」的瀏覽器環境。這意味着在RWC或者瀏覽器端,是以Window對象及其中的Document對象來提供輸入輸出的。spa

但這仍然不是所有的真相。由於「RWC規範下的宿主環境」,並不等同於「JavaScript規範下的宿主環境」。本書並不打算討論與特定瀏覽器相關的細節問題,所以咱們事實上在說的是JavaScript的一個公共語言環境,或者說公共的宿主環境的定義。做爲程序運行過程當中對輸入輸出的基本要求,本書設定宿主環境在全局應當支持如表1-3所示的方法:
表1-3  本書對宿主環境在全局方法上的簡單設定設計

方法code

含義orm

alert(sMessage)

顯示一個消息文本(字符串),並等待用戶一次響應。調用者將忽略響應的返回信息

 

write(sText, ...)

輸出一個段文本,多個參數將被鏈接成單個字符串文本

(*注1)

writeln(sText, ...)

(同write,)輸出一段文本,多個參數將被鏈接成單個字符串文本。並在文本未尾追加一個換行符(\n

 

*注1:write()與writeln()在瀏覽器中是Document對象的方法。爲遵循這一慣例,在本書的全部測試範例中並不直接使用這兩個方法。但這裏保留了它們,以描述宿主環境的標準輸入輸出。

對於不一樣的宿主來講,這些方法依賴於不一樣的對象層次的「頂層對象(或全局對象)」。例如瀏覽器宿主依賴於Window對象,而WSH宿主則依賴於WScript對象。但在本書中,調用這些方法時將略去這個對象。所以,至少它看起來很像是Global對象上的方法(事實上,大多數的宿主默認「頂層對象」不須要使用全名的約定)。

下面的代碼說明在具體的宿主環境中如何實現本書所適用的alert()方法。例如:

 

// 示例1: .NET Framework中的JScript 8.0,(當前的)頂層對象取決於import語句
// (注: JScript.NET中的腳本須要編譯執行)
import System.Windows.Forms;
function alert(sMessage) {
MessageBox.Show(sMessage);
}
alert('Hello, World!')

// 示例2:瀏覽器環境中使用的頂層對象是window
alert('Hello, World!');

// 示例3:WSH環境中使用的頂層對象是WScript, 但必須使用全名function alert(sMessage) {WScript.Echo(sMessage);}alert('Hello, World!');

相關文章
相關標籤/搜索