JavaScript

--所支援。JavaScript與Java在名字和語法上都很相似，但這兩門程式語言從設計之初就有很大不同。JavaScript在語言設計上主要受到了Self。對於客戶端來說，JavaScript通常被實現為一門解釋語言，但如今它已經可以被即時編譯。歷史.肇始於網景.1993年，國家超級電腦應用中心發表了NCSA Mosaic，這是最早流行的圖形介面網頁瀏覽器，它在全球資訊網的普及上發揮了重要作用。1994年，Mosaic的主要開發人員創立了Netscape公司，並僱用了許多原來的NCSA Mosaic開發者用來開發Netscape Navigator，該公司的目標是取代NCSA Mosaic成為世界第一的網頁瀏覽器。在四個月內，已經佔據了四分之三的瀏覽器市場，並成為1990年代網際網路的主要瀏覽器。在網路發展的這些年，網頁只能是靜態的，缺乏在瀏覽器中載入網頁後的動態行為能力。公司的創始人馬克·安德森認為HTML需要一種膠水語言，讓網頁設計師和兼職程式設計師可以很容易地使用它來組裝圖片和外掛程式之類的元件，且程式碼可以直接編寫在網頁標記中。1995年，網景招募了布蘭登·艾克，目標是把Scheme語言嵌入到Netscape Navigator瀏覽器中。但更早之前，網景已經跟昇陽合作，計劃在Netscape Navigator中嵌入Java語言，這時網景內部產生激烈的爭論，網景公司管理層很快決定，最佳的方案是由艾克設計一種新的語言，其語法類似於Java，而不像Scheme或其他現存的指令碼語言。為了在其他競爭提案中捍衛JavaScript這個想法，公司需要有一個可以運作的原型。艾克在1995年5月僅花了十天時間就把原型設計出來了。最初命名為Mocha，1995年9月在Netscape Navigator 2.0的Beta版中改名為LiveScript，同年12月，Netscape Navigator 2.0 Beta 3中部署時被重新命名為JavaScript。當時網景公司與昇陽電腦公司組成的開發聯盟為了讓這門語言搭上Java這個程式語言“熱詞”，因此將其臨時改名為JavaScript，日後這成為大眾對這門語言有諸多誤解的原因之一。微軟採納.微軟公司於1995年首次推出Internet Explorer，引發了與Netscape的瀏覽器大戰。微軟對Netscape Navigator直譯器進行了逆向工程，建立了JScript，以與處於市場領導地位的網景產品同臺競爭。JScript也是一種JavaScript實作，這兩個JavaScript語言版本在瀏覽器端共存意味著語言標準化的缺失。發展初期，JavaScript的標準並未確定，同期就有網景的JavaScript和微軟的JScript。除此之外，微軟也在網頁技術上加入了不少專屬物件，使不少網頁使用非微軟平臺及瀏覽器無法正常顯示。這導致在瀏覽器大戰期間網頁設計者通常會把「用Netscape可達到最佳效果」或「用IE可達到最佳效果」的標誌放在首頁。標準化.1996年11月，網景正式向ECMA提交語言標準。1997年6月，ECMA以JavaScript語言為基礎制定了ECMAScript標準規範ECMA-262。JavaScript成為了ECMAScript最著名的實現之一。除此之外，ActionScript和JScript也都是ECMAScript規範的實現語言。儘管JavaScript作為給非程式人員的指令碼語言，而非作為給程式人員的程式語言來推廣和宣傳，但是JavaScript具有非常豐富的特性。概論.一般來說，完整的JavaScript包括以下幾個部分：JavaScript的基本特點如下：JavaScript常用來完成以下任務：特性.不同於伺服器端指令碼語言的發展，以及事件驅動和非同步IO等特性，JavaScript也被逐漸用來編寫伺服器端程式。以下是ECMAScript通常所實現的特性。指令式與結構化.JavaScript支援許多C語言的結構化程式設計語法，但作用域是一個例外。JavaScript在過去只支援使用codice_1關鍵字來定義變數的函式作用域，但ECMAScript 2015中加入了codice_2關鍵字來支援塊級作用域。這意味著JavaScript現在既支援函式作用域又支援塊級作用域。JavaScript還支援自動在語句末新增分號，允許忽略語句末尾的分號。弱型別.Javascript是弱型別的，這意味著變數可以被隱式轉換為另一個型別。下列為變數轉換為字串的例子：型別的隱藏轉換是JavaScript受到批評的原因之一，因為隱藏轉換增加了規則的複雜度和發生錯誤的可能性。動態化.型別.JavaScript是動態型別的語言，其型別與值而不是與變數相關聯。例如變數可以為數字，隨後又可被賦值為字串。JavaScript提供了包括鴨子型別在內的方法來檢測變數型別。執行時估值.Javascript提供codice_11函式，可以在執行時直接執行Javascript語句。基於原型的面向物件.在JavaScript中，物件是關聯陣列，透過原型都可以透過 codice_15迴圈訪問。原型.JavaScript使用原型，而許多其它面嚮物件語言使用類用於實現繼承。原型使得在JavaScript中模擬基於類的面向物件特徵變成可能。函式作為物件構造器.函式在JavaScript中兼作為物件建構函式。在函式呼叫前加上codice_16會建立一個原型的例項，並繼承來自建構函式的屬性和方法。儘管可以這麼做，但對codice_10原型進行修改並不是好的做法。因為大多數JavaScript物件都會從codice_10繼承，且不會希望其原型被修改。函式作為方法.和大多數面向物件的語言不同，在JavaScript中函式定義和方法定義沒有明顯區別。唯一的區別在於呼叫時：當函式被作為方法呼叫時，函式的codice_25會指向呼叫此函式的物件。傳統的類定義與使用格式.ECMAScript 2015中加入了對codice_26和codice_27關鍵字的支援，使得類的定義與繼承更類似於其他的面嚮物件語言，同時也更易使用。函式式.在JavaScript中，函式是一等的，函式也被認為是物件。因此，函式可以有屬性和方法，例如codice_28和codice_29等。巢狀函式指定義於其它函式內部的函式，在外部函式被呼叫時，巢狀函式會被建立。另外，巢狀函式是一個閉包，在外部函式的作用域都成為內部函式狀態的一部分，甚至在外部函式執行完畢後，內部函式的狀態依然保留。JavaScript同時也支援匿名函式。其它.執行時環境.JavaScript通常依賴於執行時環境的功能。這本身不是語言功能，但在大多數JavaScript實現中很常見。非同步.JavaScript一般來說是單執行緒的。為了併發地處理事件，JavaScript程式輸入或輸出時使用事件和回撥函式執行。這意味著JavaScript可以在等待資料庫查詢返回資訊之前處理滑鼠單擊。ECMAScript 2015引入了codice_31用於處理非同步事件，其可以使得傳統的基於回撥的非同步程式碼更加清晰簡單。變長引數.JavaScript中函式引數的長度是可變的，在函式內部可以透過codice_32物件訪問這些引數。程式設計.JavaScript是一門指令碼語言，其原始碼在客戶端執行前不需經過編譯，而是將文字格式的字元程式碼傳送給瀏覽器，由瀏覽器解釋執行。直譯語言的弱點是安全性較差，而且在JavaScript中，如果一條語句執行不了，通常它下面的語言也就無法執行。解決辦法是使用異常處理codice_33︰-{zh-hans:console.log("a"); //這是正確的console.log("b"); //這是正確的console.logg("c"); //這是錯誤的，並且到這裡會停下來console.log("d"); //這是正確的console.log("e"); //這是正確的/* 解決辦法 */try { console.log("a"); } catch (e) {} //這是正確的try { console.log("b"); } catch (e) {} //這是正確的try { console.logg("c"); } catch (e) {} //這是錯誤的，但是到這裡不會停下來，而是跳過try { console.log("d"); } catch (e) {} //這是正確的try { console.log("e"); } catch (e) {} //這是正確的console.log("a"); //這是正確的console.log("b"); //這是正確的console.logg("c"); //這是錯誤的，並且到這裡會停下來console.log("d"); //這是正確的console.log("e"); //這是正確的/* 解決辦法 */try { console.log("a"); } catch (e) {} //這是正確的try { console.log("b"); } catch (e) {} //這是正確的try { console.logg("c"); } catch (e) {} //這是錯誤的，但是到這裡不會停下來，而是跳過try { console.log("d"); } catch (e) {} //這是正確的try { console.log("e"); } catch (e) {} //這是正確的JavaScript被歸類為直譯語言，因為主流的引擎都是每次執行時載入程式碼並解譯。V8是將所有程式碼解譯後再開始執行，其他引擎則是逐行解譯，因此在不同的測試上，兩者效能互有優劣。與其相對應的是編譯語言，以編譯語言編寫的程式在執行之前必須經過編譯，將程式碼編譯為機器碼，才可以執行。範例.以下是一個簡單的JavaScript Hello World︰-{zh-hans:document.write("Hello, world!"); // 直接插入頁面中alert("Hello, world!"); // 彈窗顯示console.log("Hello, world!"); // 在控制檯裡顯示，需要先開啟開發工具控制檯HTML內容……document.write("Hello, world!"); // 於瀏覽器視窗內直接顯示alert("Hello, world!"); // 開啟對話視窗顯示console.log("Hello, world!"); // 於console裡顯示，需要先開啟開發工具控制檯HTML內容……或是在瀏覽器的位址列中使用codice_34，以互動方式表示：javascript:alert("Hello world!");版本.JavaScript最初開發於1996年，被使用於Netscape Navigator網頁瀏覽器。同年微軟在Internet Explorer發布了一個實作。由於商標問題，這項實作被命名為JScript。1997年，JavaScript已經被網景公司提交給ECMA制定為標準，稱之為ECMAScript，標準編號ECMA-262。使用顯式版本號宣告對語言的引用，作為一項Mozilla的特性，已在較新版本中被移除。下列表格的資訊基於多個參考