本页使用了标题或全文手工转换

JavaScript

维基百科,自由的百科全书
跳到导航 跳到搜索
JavaScript
编程范型 脚本语言面向对象基于原型),指令式函数式
設計者 布蘭登·艾克
實作者 网景通讯公司Mozilla基金会
发行时间 1995年12月4日,​22年前​(1995-12-04[1]
穩定版本
ECMAScript 2016[2]
( 2016年6月17日,​2年前​(2016-06-17
型態系統 动态类型duck
網站 developer.mozilla.org/en-US/docs/Web/JavaScript
主要實作產品
V8JavaScriptCoreSpiderMonkeyChakra
啟發語言
CJavaPerlPythonSchemeSelf
影響語言
ActionScriptCoffeeScriptDartJScript .NETObjective-JQML、TIScript、TypeScript
JavaScript
Javascript icon.svg
扩展名 .js
互联网媒体类型 application/javascript
text/javascript (obsolete)[3]
统一类型标识 com.netscape.javascript-source[4]
格式类型 脚本语言

JavaScript,通常缩写为JS,是一种高级的,解释执行编程语言[5]。JavaScript是一门基于原型、函数先行的语言[6],是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化[5]。它被世界上的绝大多数网站所使用,也被世界主流浏览器ChromeIEFirefoxSafariOpera)支持。

虽然JavaScript与Java这门语言不管是在名字上,或是在语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同,JavaScript的语言设计主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响[6]。在语法结构上它又与C语言有很多相似(例如if条件语句、while循环、switch语句、do-while循环等)[7]

在客户端,JavaScript在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的HTML5CSS3语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如Node.js

历史[编辑]

肇始於網景[编辑]

1993年,伊利諾大學厄巴納-香檳分校國家超級電腦應用中心(NCSA)發表了NCSA Mosaic,這是最早流行的圖形介面網頁瀏覽器,它在全球資訊網的普及上發揮了重要作用。1994年,一家名為Mosaic Communications的公司在加州山景城成立了,並雇用了許多原來的NCSA Mosaic開發者用來開發Mosaic Netscape,該公司的目標是取代NCSA Mosaic成為世界第一的網頁瀏覽器。第一個版本的網頁瀏覽器Mosaic Netscape 0.9於1994年底發布。在四個月內,已經佔據了四分之三的瀏覽器市場,並成為1990年代網際網路的主要瀏覽器。為避免NCSA的商標所有權問題,該瀏覽器於同年更名為Netscape Navigator,該公司命名為Netscape Communications。網景預見到網路需要變得更動態。公司的創始人馬克·安德森認為HTML需要一種膠水語言,讓網頁設計師和兼職程式設計師可以很容易地使用它來組裝圖片和外掛程式之類的元件,且程式碼可以直接編寫在網頁標記中。

1995年,網景招募了布兰登·艾克,目標是把Scheme語言嵌入到Netscape Navigator瀏覽器當中[8]。但更早之前,網景已經跟昇阳合作在Netscape Navigator中支援Java,這時網景內部產生激烈的爭論[9]。後來網景決定發明一種與Java搭配使用的輔助腳本語言並且語法上有些類似[10],這個決策導致排除了採用現有的語言,例如PerlPythonTcl或Scheme。為了在其他競爭提案中捍衛JavaScript這個想法,公司需要有一個可以運作的原型。艾克在1995年5月僅花了十天時間就把原型設計出來了。

最初命名為Mocha,1995年9月在Netscape Navigator 2.0的Beta版中改名為LiveScript,同年12月,Netscape Navigator 2.0 Beta 3中部署時被重新命名為JavaScript[1][11],當時网景公司与昇阳电脑公司组成的开发联盟为了让这门语言搭上Java这个编程语言“热词”,因此将其临时改名为JavaScript,日后这成为大众对这门语言有诸多误解的原因之一[12]

微軟採用[编辑]

JavaScript推出后在浏览器上大获成功,微软公司在不久后就为Internet Explorer 3浏览器推出了JScript,以与处于市场领导地位的网景产品同台竞争。JScript也是一种JavaScript实现,这两个JavaScript语言版本在浏览器端共存意味着语言标准化的缺失,发展初期,JavaScript的标准并未确定,同期有网景的JavaScript,微软的JScript雙峰並峙。除此之外,微軟也在網頁技術上加入了不少專屬物件,使不少網頁使用非微軟平台及瀏覽器無法正常顯示[13][14],導致在瀏覽器大戰期間網頁設計者通常會把「用Netscape可達到最佳效果」或「用IE可達到最佳效果」的標誌放在首頁[15]。隨著Internet Explorer 4的發布,微軟引入了動態HTML的概念,但語言實現和不同專有化的文件物件模型的差異仍然存在,成為網路上普及使用JavaScript的阻礙[13]

标准化[编辑]

1996年11月,網景正式向ECMA(欧洲计算机制造商协会)提交語言標準。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。JavaScript成為了ECMAScript最著名的實現之一[16]。除此之外,ActionScriptJScript也都是ECMAScript规范的实现语言。儘管JavaScript作為給非程式人員的腳本語言,而非作為給程式人員的程式語言來推廣和宣傳,但是JavaScript具有非常豐富的特性。

概論[编辑]

一般来说,完整的JavaScript包括以下几个部分:

  • ECMAScript,描述了该语言的语法和基本对象
  • 文档对象模型(DOM),描述处理网页内容的方法和接口
  • 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口

JavaScript的基本特点如下:

  • 是一种解释性脚本语言(代码不进行预编译)。
  • 主要用来向HTML页面添加交互行为
  • 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

JavaScript常用来完成以下任务:

  • 嵌入动态文本于HTML页面
  • 对浏览器事件作出响应
  • 读写HTML元素
  • 在数据被提交到服务器之前验证数据
  • 检测访客的浏览器信息
  • 控制cookies,包括创建和修改等

特性[编辑]

不同於伺服器端腳本語言,例如PHPASP,JavaScript主要被作为客户端腳本語言在用戶的瀏覽器上運行,不需要伺服器的支持。所以在早期程式設計師比較青睞於JavaScript以減少對伺服器的負擔,而與此同時也帶來另一個問題:安全性。而隨著伺服器的強壯,雖然現在的程序員更喜歡運行於伺服端的腳本以保證安全,但JavaScript仍然以其跨平台、容易上手等優勢大行其道。同时,有些特殊功能(如AJAX)必须依赖JavaScript在客户端进行支持。隨著引擎如V8和框架如Node.js的發展,及其事件驅動異步IO等特性,JavaScript逐漸被用來編寫伺服器端程式。且在近几年中,Node.js的出世,让JavaScript也具有了一定的服务器功能,且在某些方面比PHP的效果更为显著。

指令式与结构化[编辑]

JavaScript从支持许多C语言的结构化编程语法(例如if条件语句、while循环、switch语句、do-while循环等)。但作用域是一个例外:JavaScript只支持使用var关键字来定义变量的函数作用域。ECMAScript加入了let关键字来支持块级作用域,意味着JavaScript现在既支持函数作用域又支持块级作用域。正如C语言一样,JavaScript中的表达式和语句是不同的。与C不同,JavaScript支持自动在语句末添加分号。

动态化[编辑]

正如大部分脚本语言,类型与值而不是与变量关联。例如x变量可以为数值,随后又可被赋值为字符串。JavaScript提供了包括鸭子类型在内的方法来检测变量类型。

Eval()[编辑]

Eval() 函數可以直接執行一個JavaScript函式。例如:

eval("alert(\"Message\")");

编程[编辑]

JavaScript是一種腳本語言,其原始碼在發往客户端執行之前不需經過編譯,而是將文本格式的字符代碼發送給瀏覽器由瀏覽器解釋執行。直譯語言的弱點是安全性較差,而且在JavaScript中,如果一條執行不了,那麼下面的語言也無法執行。而其解決辦法就是於使用异常处理try{}catch(){}

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是將所有程式碼解譯後再開始執行,其他引擎則是逐行解譯(SpiderMonkey會將解譯過的指令暫存,以提高效能,稱為即時編譯),但由於V8的核心部份多數用JavaScript撰寫(而SpiderMonkey是用C++),因此在不同的測試上,兩者效能互有優劣。

與其相對應的是編譯語言,例如C语言,以編譯語言編寫的程式在執行之前,必須經過編譯,將程式碼編譯為機器碼,再加以執行。

範例[编辑]

以下是一個簡單的JavaScript Hello World

<!DOCTYPE HTML>
<html>
    <head>
    <title>简单的JavaScript Hello World</title>
        <script type="text/javascript">
            document.write("Hello, world!");   // 在浏览器视窗内直接显示
            alert("Hello, world!");            // 弹窗显示
            console.log("Hello, world!");      // 在控制台(console)里显示,需要先开启开发工具控制台
        </script>
    </head>
    <body>
    HTML内容……
    </body>
</html>

或是在瀏覽器地址栏中使用javascript:,以互動方式表示:

javascript:alert("Hello world!");

版本[编辑]

JavaScript最初開發於1996年,被使用於Netscape Navigator網頁瀏覽器。同年微軟在Internet Explorer發布了一個實作。由於商標問題,這項實作被命名為JScript。1997年,JavaScript已經被網景公司提交給ECMA制定為標準,稱之為ECMAScript,標準編號ECMA-262。目前最新版為ECMA-262 5th Edition[17]。目前ECMA-262 4th Edition正在開發的過程中,與其對應的JavaScript的版本為JavaScript 2.0,目前也正在開發過程中。

下列表格的資訊基於多個參考來源[18][19][20][21]

版本 發布日期 基於 Netscape
Navigator
Mozilla
Firefox
Internet
Explorer
Opera Safari Google
Chrome
舊版本,不再支持: 1.0 1996年3月 2.0 3.0
舊版本,不再支持: 1.1 1996年8月 3.0
舊版本,不再支持: 1.2 1997年6月 4.0 - 4.05 3
舊版本,不再支持: 1.3 1998年10月 ECMA-262 1st + 2nd edition 4.06 - 4.7x 4.0 5[22]
舊版本,不再支持: 1.4 Netscape
Server
6
舊版本,不再支持: 1.5 2000年11月 ECMA-262 3rd edition 6.0 1.0 5.5(JScript 5.5)
6(JScript 5.6)
7(JScript 5.7)
8(JScript 5.8)
7.0 3.0-5 1.0 - 10.0.666
舊版本,不再支持: 1.6 2005年11月 1.5 + Array extras + Array and string generics + E4X 1.5
舊版本,不再支持: 1.7 2006年10月 1.6 + Pythonic generators + Iterators + Let 2.0 28.0.1500.95
舊版本,不再支持: 1.8 2008年6月 1.7 + Generator expressions + Expression closures 3.0 11.50
舊版本,不再支持: 1.8.1 1.8 + native JSON support + Minor updates 3.5
舊版本,不再支持: 1.8.2 2009年6月22日 1.8.1 + Minor updates 3.6
舊版本,不再支持: 1.8.5 2010年7月27日 1.8.2 + New features for ECMA-262 5th edition compliance 4.0

參見[编辑]

參考文獻[编辑]

  1. ^ 1.0 1.1 Press release announcing JavaScript, "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995
  2. ^ Standard ECMA-262. Ecma International. 2015-06-17. 
  3. ^ RFC 4329 互联网档案馆存檔,存档日期2014-03-16.
  4. ^ System-Declared Uniform Type Identifiers. Mac OS X Reference Library. Apple Inc. [2010-03-05]. 
  5. ^ 5.0 5.1 David, Flanagan. JavaScript: The Definitive Guide 6th. O'Reilly & Associates. ISBN 978-0-596-80552-4. 
  6. ^ 6.0 6.1 ECMAScript Language Overview (PDF): 4. 2007-10-23 [2009-05-03]. (原始内容 (PDF)存档于2010-07-13). 
  7. ^ JavaScript: The World's Most Misunderstood Programming Language. www.crockford.com. [2016-08-17]. 
  8. ^ Chapter 4. How JavaScript Was Created. 
  9. ^ Severance, Charles. JavaScript: Designing a Language in 10 Days. Computer (IEEE Computer Society). February 2012, 45 (2): 7–8 [23 March 2013]. doi:10.1109/MC.2012.57. 
  10. ^ TechVision: Innovators of the Net: Brendan Eich and JavaScript. 2009-03-19. (原始内容 (HTML)存档于2008-02-08). 
  11. ^ TechVision: Innovators of the Net: Brendan Eich and JavaScript. web.archive.org. (原始内容存档于2008-02-08). 
  12. ^ Fin JS, Brendan Eich - CEO of Brave, 2016-06-17 [2018-02-07] 
  13. ^ 13.0 13.1 Champeon, Steve. JavaScript, How Did We Get Here?. oreilly.com. 6 April 2001 [16 July 2016]. (原始内容存档于2016-07-19). 
  14. ^ Microsoft Internet Explorer 3.0 Beta Now Available. microsoft.com. Microsoft. 29 May 1996 [16 July 2016]. 
  15. ^ McCracken, Harry. The Unwelcome Return of "Best Viewed with Internet Explorer". technologizer.com. 16 September 2010 [16 July 2016]. 
  16. ^ Nicholas, Zakas. Professional JavaScript for Web Developers 3rd. Wrox. 2012. ISBN 978-1-118-02669-4. 
  17. ^ https://developer.mozilla.org/en/JavaScript/Language_Resources
  18. ^ New in JavaScript. developer.mozilla.org. 2014 [2016-07-16]. 
  19. ^ JavaScript – JScript – ECMAScript version history. Webmasterworld.com. [2009-12-17]. 
  20. ^ John Resig. Versions of JavaScript. Ejohn.org. [2009-05-19]. 
  21. ^ Version Information (JScript). Msdn.microsoft.com. [2009-12-17]. 
  22. ^ What Version of JavaScript. 

外部連結[编辑]