自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaScript概述

開發(fā) 前端 后端
Javascript取得成功了之后,確實(shí)為頁(yè)面注入了活力,微軟也緊接著開發(fā)自己的瀏覽器腳本語言,一個(gè)是基于BASIC語言的VBScript,另一個(gè)是跟Javascript非常類似的Jscript,但是由于Javascript已經(jīng)深入人心

1.1 Javascript簡(jiǎn)史

在20世紀(jì)90年代,也就是早期的WEB站點(diǎn)上,所有的網(wǎng)頁(yè)內(nèi)容都是靜態(tài)的,所謂靜態(tài)是指,除了點(diǎn)擊超鏈接,你無法通過任何方式同頁(yè)面進(jìn)行交互,比如讓頁(yè)面元素接受事件,修改字體等。人們于是迫切的需要一種方式來打破這個(gè)局限,于是到了1996年,網(wǎng)景(Netscape)公司開始研發(fā)一種新的語言Mocha,并將其嵌入到自己的瀏覽器Netscape中,這種語言可以通過操縱DOM(Document Object Model,文檔對(duì)象模型)來修改頁(yè)面,并加入了對(duì)鼠標(biāo)事件的支持。Mocha使用了C的語法,但是設(shè)計(jì)思想上主要從函數(shù)式語言Scheme那里取得了靈感。當(dāng)Netscape 2發(fā)布的時(shí)候,Mocha被改名為L(zhǎng)iveScript,當(dāng)時(shí)可能是想讓LiveScript為WEB頁(yè)面注入更多的活力。后來,考慮到這個(gè)腳本語言的推廣,網(wǎng)景采取了一種宣傳策略,將LiveScript更名為JavaScript,目的是為了跟當(dāng)時(shí)非常流行的面向?qū)ο笳Z言Java發(fā)生曖昧的關(guān)系。這種策略顯然頗具成效,以至于到現(xiàn)在很多初學(xué)者還會(huì)為JavaScript和Java的關(guān)系而感到困惑。

Javascript取得成功了之后,確實(shí)為頁(yè)面注入了活力,微軟也緊接著開發(fā)自己的瀏覽器腳本語言,一個(gè)是基于BASIC語言的VBScript,另一個(gè)是跟Javascript非常類似的Jscript,但是由于Javascript已經(jīng)深入人心,所以在隨后的版本中,微軟的IE幾乎是將Javascript作為一個(gè)標(biāo)準(zhǔn)來實(shí)現(xiàn)。當(dāng)然,兩者仍然有不兼容的地方。1996年后期,網(wǎng)景向歐洲電腦廠商協(xié)會(huì)(ECMA)提交了Javascript的設(shè)計(jì),以申請(qǐng)標(biāo)準(zhǔn)化,ECMA去掉了其中的一些實(shí)現(xiàn),并提出了ECMAScript-262標(biāo)準(zhǔn),并確定Javascript的正式名字為ECMAScript,但是JavaScript的名字已經(jīng)深入人心,故本書中仍沿用Javascript這個(gè)名字。

1.1.1動(dòng)態(tài)網(wǎng)頁(yè)

WEB頁(yè)面在剛開始的時(shí)候,是不能動(dòng)態(tài)修改其內(nèi)容的,要改變一個(gè)頁(yè)面的內(nèi)容,需要先對(duì)網(wǎng)站上的靜態(tài)HTML文件進(jìn)行修改,然后需要刷新瀏覽器。后來出現(xiàn)的JSP,ASP等服務(wù)器端語言可以為頁(yè)面提供動(dòng)態(tài)的內(nèi)容,但是如果沒有JavaScript則無法在服務(wù)器返回之后動(dòng)態(tài)的在前端修改頁(yè)面,也無法有諸如鼠標(biāo)移上某頁(yè)面元素則高亮該元素之類的效果,因此JavaScript的出現(xiàn)大大的豐富了頁(yè)面的表現(xiàn),提高了用戶體驗(yàn)。

而當(dāng)AJAX流行起來之后,更多的非常絢麗的WEB應(yīng)用涌現(xiàn)了,而且呈越來越多的趨勢(shì),如Gmail,Google Map,Google Reader,Remember the milk,facebook等等優(yōu)秀的WEB2.0應(yīng)用,都大量的使用了JavaScript及其衍生的技術(shù)AJAX。

1.1.2瀏覽器之戰(zhàn)

1.1.3標(biāo)準(zhǔn)

1.2 JavaScript語言特性

JavaScript是一門動(dòng)態(tài)的,弱類型,基于原型的腳本語言。在JavaScript中“一切皆對(duì)象”,在這一方面,它比其他的OO語言來的更為徹底,即使作為代碼本身載體的function,也是對(duì)象,數(shù)據(jù)與代碼的界限在JavaScript中已經(jīng)相當(dāng)模糊。雖然它被廣泛的應(yīng)用在WEB客戶端,但是其應(yīng)用范圍遠(yuǎn)遠(yuǎn)未局限于此。下面就這幾個(gè)特點(diǎn)分別介紹:

1.2.1動(dòng)態(tài)性

動(dòng)態(tài)性是指,在一個(gè)Javascript對(duì)象中,要為一個(gè)屬性賦值,我們不必事先創(chuàng)建一個(gè)字段,只需要在使用的時(shí)候做賦值操作即可,如下例:

  1. //定義一個(gè)對(duì)象  
  2. var obj = new Object();  
  3. //動(dòng)態(tài)創(chuàng)建屬性name  
  4. obj.name = "an object";  
  5. //動(dòng)態(tài)創(chuàng)建屬性sayHi  
  6. obj.sayHi = function(){  
  7. return "Hi";  
  8. }  
  9. obj.sayHi(); 

加入我們使用Java語言,代碼可能會(huì)是這樣:

  1. class Obj{  
  2. String name;  
  3. Function sayHi;  
  4. public Obj(Sting name, Function sayHi){  
  5. this.name = name;  
  6. this.sayHi = sayHi;  
  7. }  
  8. }  
  9. Obj obj = new Obj("an object"new Function()); 

動(dòng)態(tài)性是非常有用的,這個(gè)我們?cè)诘谌聲?huì)詳細(xì)講解。

1.2.2弱類型

與Java,C/C++不同,Javascript是弱類型的,它的數(shù)據(jù)類型無需在聲明時(shí)指定,解釋器會(huì)根據(jù)上下文對(duì)變量進(jìn)行實(shí)例化,比如:

  1. //定義一個(gè)變量s,并賦值為字符串  
  2. var s = "text";  
  3. print(s);  
  4. //賦值s為整型  
  5. s = 12+5;  
  6. print(s);  
  7. //賦值s為浮點(diǎn)型  
  8. s = 6.3;  
  9. print(s);  
  10. //賦值s為一個(gè)對(duì)象  
  11. s = new Object();  
  12. s.name = "object";  
  13. print(s.name); 

結(jié)果為:

text
17
6.3
Object

可見,Javascript的變量更像是一個(gè)容器,類似與Java語言中的頂層對(duì)象Object,它可以是任何類型,解釋器會(huì)根據(jù)上下文自動(dòng)對(duì)其造型。

弱類型的好處在于,一個(gè)變量可以很大程度的進(jìn)行復(fù)用,比如String類型的name字段,在被使用后,可以賦值為另一個(gè)Number型的對(duì)象,而無需重新創(chuàng)建一個(gè)新的變量。不過,弱類型也有其不利的一面,比如在開發(fā)面向?qū)ο蟮腏avascript的時(shí)候,沒有類型的判斷將會(huì)是比較麻煩的問題,不過我們可以通過別的途徑來解決此問題。

1.2.3解釋與編譯

通常來說,Javascript是一門解釋型的語言,特別是在瀏覽器中的Javascript,所有的主流瀏覽器都將Javascript作為一個(gè)解釋型的腳本來進(jìn)行解析,然而,這并非定則,在Java版的Javascript解釋器rhino中,腳本是可以被編譯為Java字節(jié)碼的。

解釋型的語言有一定的好處,即可以隨時(shí)修改代碼,無需編譯,刷新頁(yè)面即可重新解釋,可以實(shí)時(shí)看到程序的結(jié)果,但是由于每一次都需要解釋,程序的開銷較大;而編譯型的語言則僅需要編譯一次,每次都運(yùn)行編譯過的代碼即可,但是又喪失了動(dòng)態(tài)性。

我們將在第九章和第十章對(duì)兩種方式進(jìn)行更深入的討論。

1.3 Javascript應(yīng)用范圍

當(dāng)Javascript第一次出現(xiàn)的時(shí)候,是為了給頁(yè)面帶來更多的動(dòng)態(tài),使得用戶可以與頁(yè)面進(jìn)行交互為目的的,雖然Javascript在WEB客戶端取得了很大的成功,但是ECMA標(biāo)準(zhǔn)并沒有局限其應(yīng)用范圍。事實(shí)上,現(xiàn)在的Javascript大多運(yùn)行與客戶端,但是仍有部分運(yùn)行于服務(wù)器端,如Servlet,ASP等,當(dāng)然,Javascript作為一個(gè)獨(dú)立的語言,同樣可以運(yùn)行在其他的應(yīng)用程序中,比如Java版的JavaScript引擎Rhino,C語言版的SpiderMonkey等,使用這些引擎,可以將JavaScript應(yīng)用在任何應(yīng)用之中。

1.3.1客戶端Javascript

客戶端的JavaScript隨著AJAX技術(shù)的復(fù)興,越來越凸顯了Javascript的特點(diǎn),也有越來越多的開發(fā)人員開始進(jìn)行JavaScript的學(xué)習(xí),使用Javascript,你可以使你的WEB頁(yè)面更加生動(dòng),通過AJAX,無刷新的更新頁(yè)面內(nèi)容,可以大大的提高用戶體驗(yàn),隨著大量的JavaScript包如jQuery, ExtJS,Mootools等的涌現(xiàn),越來越多的絢麗,高體驗(yàn)的WEB應(yīng)用被開發(fā)出來,這些都離不來幕后的JavaScript的支持。

 

 

圖JavaScript實(shí)現(xiàn)的一個(gè)WEB幻燈片

瀏覽器中的JavaScript引擎也進(jìn)行了長(zhǎng)足的發(fā)展,比如FireFox 3,當(dāng)時(shí)一個(gè)宣傳的重點(diǎn)就是速度比IE要快,這個(gè)速度一方面體現(xiàn)在頁(yè)面渲染上,另一方面則體現(xiàn)在JavaScript引擎上,而Google的Chrome的JavaScript引擎V8更是將速度發(fā)展到了極致。很難想象,如果沒有JavaScript,如今的大量的網(wǎng)站和WEB應(yīng)用會(huì)成為什么樣子。

我們可以看幾個(gè)例子,來說明客戶端的JavaScript的應(yīng)用程度:

 

 

圖 ExtJS實(shí)現(xiàn)的一個(gè)網(wǎng)絡(luò)相冊(cè),ExtJS是一個(gè)非常優(yōu)秀的JavaScriipt庫(kù)

 

 

圖 ExtJS實(shí)現(xiàn)的一個(gè)表格,具有排序,編輯等功能

當(dāng)然,客戶端的JavaScript各有側(cè)重,jQuery以功能見長(zhǎng),通過選擇器,可以完成80%的頁(yè)面開發(fā)工作,并且提供強(qiáng)大的插件機(jī)制,下圖為jQuery的UI插件:

 

 

總之,隨著Ajax的復(fù)興,客戶端的JavaScript得到了很大的發(fā)展,網(wǎng)絡(luò)上流行著大量的優(yōu)秀的JavaScript庫(kù),現(xiàn)在有一個(gè)感性的認(rèn)識(shí)即可,我們?cè)诤筮叺恼鹿?jié)會(huì)擇其尤要者進(jìn)行詳細(xì)講解。

 

1.3.2服務(wù)端Javascript

相對(duì)客戶端而言,服務(wù)器端的JavaScript相對(duì)平淡很多,但是隨著JavaScript被更多人重視,JavaScript在服務(wù)器端也開始迅速的發(fā)展起來,Helma, Apache Sling等等。在服務(wù)器端的JavaScript比客戶端少了許多限制,如本地文件的訪問,網(wǎng)絡(luò),數(shù)據(jù)庫(kù)等。

一個(gè)比較有意思的服務(wù)端JavaScript的例子是Aptana的Jaxer,Jaxer是一個(gè)服務(wù)器端的Ajax框架,我們可以看這樣一個(gè)例子(例子來源于jQuery的設(shè)計(jì)與實(shí)現(xiàn)這John Resig):

  1. <html> 
  2. <head> 
  3. <script src="http://code.jquery.com/jquery.js" runat="both"></script> 
  4. <script> 
  5. jQuery(function($){  
  6. $("form").submit(function(){  
  7. save( $("textarea").val() );  
  8. return false;  
  9. });  
  10. });  
  11. </script> 
  12. <script runat="server"> 
  13. function save( text ){  
  14. Jaxer.File.write("tmp.txt", text);  
  15. }  
  16. save.proxy = true;  
  17. function load(){  
  18. $("textarea").val(  
  19. Jaxer.File.exists("tmp.txt") ? Jaxer.File.read("tmp.txt") : "");  
  20. }  
  21. </script> 
  22. </head> 
  23. <body onserverload="load()"> 
  24. <form action="" method="post"> 
  25. <textarea></textarea> 
  26. <input type="submit"/> 
  27. </form> 
  28. </body> 
  29. </html> 

 

runat屬性說明腳本運(yùn)行在客戶端還是服務(wù)器端,client表示運(yùn)行在客戶端,server表示運(yùn)行在服務(wù)器端,而both表示可以運(yùn)行在客戶端和服務(wù)器端,這個(gè)腳本可以訪問文件,并將文件加載到一個(gè)textarea的DOM元素中,還可以將textarea的內(nèi)容通過Form表單提交給服務(wù)器并保存。

再來看另一個(gè)例子,通過Jaxer對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問:

  1. <script runat="server">  
  2. var rs = Jaxer.DB.execute("SELECT * FROM table");  
  3. var field = rs.rows[0].field;  
  4. </script> 

 

通過動(dòng)態(tài),靈活的語法,再加上對(duì)原生的資源(如數(shù)據(jù)庫(kù),文件,網(wǎng)絡(luò)等)操作的支持,服務(wù)器端的JavaScript應(yīng)用將會(huì)越來越廣泛。

當(dāng)Google的JavaScript引擎V8出現(xiàn)以后,有很多基于V8引擎的應(yīng)用也出現(xiàn)了,其中最著名,最有前景的當(dāng)算Node.js了,下面我們來看一下Node.js的例子:

  1. <strong>var sys = require('sys'),  
  2. http = require('http');  
  3. http.createServer(function (req, res) {  
  4. setTimeout(function () {  
  5. res.sendHeader(200, {'Content-Type''text/plain'});  
  6. res.sendBody('Hello World');  
  7. res.finish();  
  8. }, 2000);  
  9. }).listen(8000);  
  10. sys.puts('Server running at http://127.0.0.1:8000/');</strong> 

保存這個(gè)腳本為sayHello.js,然后運(yùn)行:

node sayHello.js

程序?qū)?huì)在控制臺(tái)上打印:

Server running at http://127.0.0.1:8000/

訪問http://127.0.0.1:8000,兩秒鐘之后頁(yè)面會(huì)響應(yīng):Hello, World。

再來看另一個(gè)官方提供的例子:

  1. <strong>var tcp = require('tcp');  
  2. var server = tcp.createServer(function (socket) {  
  3. socket.setEncoding("utf8");  
  4. socket.addListener("connect"function () {  
  5. socket.send("hello\r\n");  
  6. });  
  7. socket.addListener("receive"function (data) {  
  8. socket.send(data);  
  9. });  
  10. socket.addListener("eof"function () {  
  11. socket.send("goodbye\r\n");  
  12. socket.close();  
  13. });  
  14. });  
  15. server.listen(7000, "localhost");</strong> 

訪問localhost的7000端口,將建立一個(gè)TCP連接,編碼方式為utf-8,當(dāng)客戶端連接到來時(shí),程序在控制臺(tái)上打印

hello

當(dāng)接收到新的數(shù)據(jù)時(shí),會(huì)將接收到的數(shù)據(jù)原樣返回給客戶端,如果客戶端斷開連接,則向控制臺(tái)打?。?/p>

goodbay

Node提供了豐富的API來簡(jiǎn)化服務(wù)器端的網(wǎng)絡(luò)編程,由于Node是基于一個(gè)JavaScript引擎的,因此天生的就具有動(dòng)態(tài)性和可擴(kuò)展性,因此在開發(fā)網(wǎng)絡(luò)程序上,確實(shí)是一個(gè)不錯(cuò)的選擇。

1.3.3其他應(yīng)用中的Javascript

通過使用JavaScript的引擎的獨(dú)立實(shí)現(xiàn),比如Rhino,SpliderMonkey,V8等,可以將JavaScript應(yīng)用到幾乎所有的領(lǐng)域,比如應(yīng)用程序的插件機(jī)制,高級(jí)的配置文件分析,用戶可定制功能的應(yīng)用,以及一些類似與瀏覽器場(chǎng)景的比如Mozilla的ThunderBrid,Mozilla的UI框架XUL,筆者開發(fā)的一個(gè)Todo管理器sTodo(在第十章詳細(xì)討論)等。

 

 

圖 sTodo 一個(gè)使用JavaScript來提供插件機(jī)制的Java桌面應(yīng)用

Java版的JavaScript引擎原生的可以通過使用Java對(duì)象,那樣將會(huì)大大提高JavaScript的應(yīng)用范圍,如數(shù)據(jù)庫(kù)操作,服務(wù)器內(nèi)部數(shù)據(jù)處理等。當(dāng)然,JavaScript這種動(dòng)態(tài)語言,在UI方面的應(yīng)用最為廣泛。

著名的Adobe reader也支持JavaScript擴(kuò)展,并提供JavaScript的API來訪問PDF文檔內(nèi)容,可以通過JavaScript來定制Adobe Reader的界面以及功能等。

  1. app.addMenuItem({  
  2. cName: "-",  
  3. // menu divider  
  4. cParent: "View",  
  5. // append to the View menu  
  6. cExec: "void(0);" 
  7. });  
  8. app.addMenuItem({  
  9. cName: "Bookmark This Page &5",  
  10. cParent: "View",  
  11. cExec: "AddBookmark();",  
  12. cEnable: "event.rc= (event.target != null);" 
  13. });  
  14. app.addMenuItem({  
  15. cName: "Go To Bookmark &6",  
  16. cParent: "View",  
  17. cExec: "ShowBookmarks();",  
  18. cEnable: "event.rc= (event.target != null);" 
  19. });  
  20. app.addMenuItem({  
  21. cName: "Remove a Bookmark",  
  22. cParent: "View",  
  23. cExec: "DropBookmark();",  
  24. cEnable: "event.rc= (event.target != null);" 
  25. });  
  26. app.addMenuItem({  
  27. cName: "Clear Bookmarks",  
  28. cParent: "View",  
  29. cExec: "ClearBookmarks();",  
  30. cEnable: "event.rc= true;" 
  31. }); 

為Adobe Reader 添加了4個(gè)菜單項(xiàng),如圖:

 

 

另一個(gè)比較有意思的JavaScript實(shí)例為一個(gè)在線的遺傳算法的演示,給定一個(gè)圖片,然后將一些多邊形(各種顏色)拼成一個(gè)圖片,拼圖的規(guī)則為使用遺傳算法,使得這些多變形組成的圖片與目標(biāo)圖片最為相似:

 

 

可見,JavaScript在其他方面的也得到了廣泛的應(yīng)用。

原文:http://abruzzi.iteye.com/blog/630410

【編輯推薦】

  1. 10個(gè)對(duì)JavaScript開發(fā)者超級(jí)有用的工具
  2. 5個(gè)有趣的JavaScript代碼片段分享
  3. 7款最受歡迎最實(shí)用的JavaScript代碼高亮腳本
  4. JavaScript的死與生
  5. JavaScript來實(shí)現(xiàn)的超炫組織結(jié)構(gòu)圖
責(zé)任編輯:陳貽新 來源: abruzzi
相關(guān)推薦

2010-09-16 09:37:21

JavaScript事

2020-09-22 12:53:37

JavaScript循環(huán)可枚舉

2011-11-28 09:25:17

Nginx概述

2018-12-13 14:10:37

JavaScript調(diào)用堆棧前端

2017-02-28 08:59:03

2021-04-12 10:46:15

人工智能機(jī)器學(xué)習(xí)

2010-07-12 09:34:59

Symbian開發(fā)

2017-04-01 17:30:36

MongoDB分片實(shí)現(xiàn)

2009-06-29 08:48:41

Hibernate緩存

2009-09-10 13:42:47

Linq UserIn

2009-09-29 16:04:29

Hibernate S

2013-08-21 16:57:48

.NET反射

2010-01-25 22:28:34

光纖入戶FTTP

2009-09-10 11:10:21

Linq Librar

2009-09-08 16:08:44

Linq使用order

2009-09-18 16:20:36

LINQ基礎(chǔ)

2010-06-03 16:19:28

2021-06-11 07:49:01

Docker容器安全 應(yīng)用程序

2023-07-17 15:40:28

2010-12-31 10:23:53

SharePoint
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)