新聞中心
今天,我們就來講講我們?yōu)槭裁磿羞@種觀念,回顧Javascript的歷史來診斷他的現(xiàn)狀,同時通過一些片段來表明Javascript同其他開發(fā)語言的本質(zhì)不同,唯有如此我們才能明白為何Javascript這么重要。

早期的迷惑
從某種程度上來講,Javascript是Java的惡魔兄弟(Java'seviltwin)。他們同歲,都于1995年以Beta的版本出現(xiàn),并且都在次年1996年推出了1.0版本。在語法上他們也很相近,從名稱上來看他們就像是一家人一樣。
我們***次聽說Javascript是在1995年,當(dāng)時Netscape推出了Navigator2.0的Beta版本,這個版本中沒有包含Javascript,但是有對于JavaApplet的支持。同時,Netscape宣布頁面內(nèi)嵌的語言LiveScript。這個聲明并沒有引起太多的注意,在當(dāng)時JavaApplet是一個熱門的技術(shù),當(dāng)時對于為什么Netscape要在瀏覽器中內(nèi)嵌兩種語言也不是十分清楚,難道有什么事情LiveScript能做而Java做不了的么?
2個月以后,LiveScript看到了曙光,在Navigator2.0B3中,它被重新命名為JavaScript。這次改動吸引了眾多人的關(guān)注?!癘h,他肯定不能體現(xiàn)他的價值?!?、“為什么Sun要讓這么個玩具來搭Java的車?”我至今仍人為這次改名是一個失敗的主意,因為他引起了無盡的困惑,很多非編程人員從來都沒有明白過Java和Javascript是兩個不同的東西。
改名字的另外一個影響是細(xì)微的,但是我認(rèn)為改善了這個語言的接受程度。與Java的關(guān)系使這門語言看起來并不是一個全新的東西。事實上,當(dāng)時Java本身都還不是十分成熟,也還沒有到1.0,但是外界對于Java成熟狀況的認(rèn)知要比本身高出很多。例如,在1995年,時代雜志將Java選為當(dāng)年的十大新產(chǎn)品之一。同時,市面上已經(jīng)有很多關(guān)于Java的書籍。所以,當(dāng)Netscape將這項技術(shù)命名為JavaScript,其意圖很明顯就是表明當(dāng)時的Java開發(fā)團體是使用和評價JavaScript的***人選。
在懷疑的浪潮中,憑借JavaScript與JavaApplet的通信和控制能力,JavaScript開始出現(xiàn)在一些應(yīng)用中。所以,那些對Java感興趣的人開始覺得有了學(xué)習(xí)JavaScript的必要。
Javascript就像一個玩具,它是面向?qū)ο蟮模械臇|西都是公有的,沒有封裝。另外,你無法創(chuàng)建真正的子類,在實例變量和方法之間并沒有真正的區(qū)別,這就像一個災(zāi)難。你可以在任何時候?qū)⒁粋€變量變成一個方法。在這方面我并不是孤獨的,雖然對于面向?qū)ο蟮募?xì)節(jié)每個人的理解都有所不同,但是Java程序員幾乎無一例外的認(rèn)為,JavaScript并不是一門嚴(yán)肅的編程語言,我們也不像用它來做些什么。
附加的傷害
在早期的時候,JavaScript并沒有什么真正的技術(shù)問題,它是緩慢又充滿風(fēng)險的,并且只在Netscape下工作。后來IE也支持了,但并不是完全兼容。人們吹捧他用來編寫頁面的applets,但是它并不能檢測applet的失敗。它從來沒有被廣泛的使用過,很快他就成為了一個分母,人們僅僅用它來完成那些可靠的任務(wù),并且避免在其他的地方使用。
什么是JavaScript能夠可靠的支持的?閃動的、基于圖像的視覺效果。人們開始制造一些炫目的效果。Netscape引導(dǎo)了這個趨勢,在頁面中使用令人生厭的圖層干擾了人們對正常內(nèi)容的瀏覽。那些各種各樣閃動、滾動的效果讓我們認(rèn)為 這個標(biāo)簽簡直就是網(wǎng)絡(luò)的原罪。到處都充斥著閃動的Banner、滾動的Banner、狀態(tài)欄里跳動的文字、隨時可能彈出的對話框、...各種各樣的濫用還在不斷繼續(xù)。Miscorsoft也開始談?wù)揇HTML,但是不久DHTML就變成了Buggy、Slow、Unmaintable網(wǎng)站的代名詞。
對了,不要忘記安全問題。一般來講,當(dāng)你構(gòu)建一個圖靈完備(Turing-Complete)的編程語言時,你就需要特別小心安全問題。Netscape做的不夠好,早期的Javascript中存在漏洞,而且花了很長時間才完全解決掉。
結(jié)果是什么?很多的有技術(shù)頭腦的用戶關(guān)閉了瀏覽器的Javascript支持。要知道,在1996年的時候可以被稱為有“技術(shù)頭腦(TechnicallySavvy)”的人員站的比重相當(dāng)?shù)母摺K?,這些人便不再依賴于JavaScript,因為這會導(dǎo)致用戶不使用你的網(wǎng)站。
那些使用JavaScript的用戶做的也不夠好。那些嚴(yán)謹(jǐn)?shù)某绦騿T完全拋棄了JavaScript,但是設(shè)計師和頁面人員補充了進來。早期的書籍中都提供了糟糕的JavaScript實例,但是很少去從語義上對它進行分析、闡述。(DavidFlanagan是個例外)讓事情更糟糕的是,有些人(也許是大多數(shù)人)根據(jù)就沒從書中學(xué)習(xí)過JavaScript,他們只是從一個網(wǎng)站現(xiàn)有的代碼中拷貝,修改,然后粘貼到自己的網(wǎng)站上讓它工作,到***都不知道為何這些代碼能夠正常運行。
即使大家都是從例子開始學(xué)習(xí)JavaScript,只要保證兩件事情這也許會成為一個很好的策略。***個就是大家都學(xué)習(xí)好的例子,但顯然JavaScript并不屬于這種情況。第二種情況就是這種語言應(yīng)該和學(xué)習(xí)它的人所知道的另外一種語言相似,但是很不幸,雖然JavaScript從語義上看來和Java非常相近,但實際上JavaScript來自一個和Java完全不同的編程語言家族。JavaScript是NewtonScript、Self、Smalltalk...和Lisp語言的一個直系后裔。WaldemarHorwat,一位在JavaScript早期產(chǎn)生重大影響的工程人員說,我更愿意把JavaScript認(rèn)為是CommonLisp的另一種形式。這個說法有些夸張,但是如果你知道這兩種語言,你就會很容易發(fā)現(xiàn)兩者之間確實存在很多相似之處。
所以狀況就變的越來越不好,一門與之前廣泛傳播的語言有很大不同的新語言,被一些沒有經(jīng)驗的編程者推廣,其他的編程人員Follow了他們的例子。更多的用戶基于安全考慮關(guān)閉了JavaScript的支持,還有有經(jīng)驗的程序員推薦大家避免使用JavaScript。
上面的這些還不夠,瀏覽器大戰(zhàn)似乎一觸即發(fā),兒JavaScript被選作了一種武器。戰(zhàn)爭中的雙方都不斷的發(fā)展JavaScript,有時候甚至故意引入了很多不兼容特性。JavaScript此時已經(jīng)變得更龐大,但同時也更容易引起問題。
也難怪沒有人會喜歡她。
帝國的重建
在那段時間,我還是不斷聽到更多關(guān)于JavaScript的消息。關(guān)于基于prototype和面向?qū)ο蟮奶匦缘慕榻B總是讓我很好奇,我曾經(jīng)看到過的教材里從來沒有提到過這些,也許是作者本人也沒有必要的語言背景去將這些概念聯(lián)系起來。同時,人們開始指出由于瀏覽器造成了多少錯誤,而不是JavaScript本身。
后來,IE贏了,Netscape投降了,這一階段的瀏覽器大戰(zhàn)結(jié)束了。Miscrosoft開始將他們的bug光芒覆蓋到CSS領(lǐng)域(任何處理過IE6下頁面開發(fā)的工程師都應(yīng)該深有感受),而Mozila的團隊則開始認(rèn)真的考慮兼容性的問題。除了一些根深蒂固的區(qū)別,想要修改他們必須大量的修改源碼,這個小組修復(fù)大多數(shù)的不同,于是IE和Mozilla/Firefox下的JavaScript變得更可控了。其他的開發(fā)者也更加的有跡可循。
JavaScript和瀏覽器的內(nèi)置支持開始進入了一段穩(wěn)固的發(fā)展時期。在我們大家都忙著寫自己的JavaScript代碼的時候,幾乎沒有人注意到一個具有傳奇色彩的特性引入-XMLHttpRequest。最重要的DHTML特性,Ajax的重要部分,悄悄的加入到了IE中來。Microsoft的Outlook小組引入了這個ActiveX控件來使Outlook支持網(wǎng)絡(luò)訪問。200年的AjaxExperience的大會上,DionAlmaer和BenGalbraith做了很多關(guān)于XMLHttpRequest的工作,但是在Mozilla***次引入XMLHttpRequest支持的時候的官方文件中,他的特性根本就沒有提到。
那段時間有很多JavaScript的活動,在JavaScript的支持下,Macromedia為Flash提供了腳本語言支持。Adobe也在不斷努力使他們的很多程序可以使用JavaScript來控制和擴展。Apple將JavaScript嵌入了它的Sherlock應(yīng)用中。當(dāng)然,Mozilla項目也做出了一個重要決定,他們大部分的瀏覽器都可以支持JavaScript。很明顯,JavaScript已經(jīng)不再僅僅是一個網(wǎng)頁語言,而成為了程序中嵌入的動態(tài)的、運行時擴展的編程語言的***。其中的原因也許是當(dāng)時大家或多或少的都會一些JavaScript,還有當(dāng)時存在兩個高質(zhì)量的嵌入擴展(SpiderMonkeyc語言編寫,RhinoJava語言編寫)。
在2000年的時候,一些人(著名的BrentAshley、AlexRussell、DouglasCrockford)開始注意到JavaScript究竟能做什么。Brend開始研究JavaScript與服務(wù)器通信的方法,提出了我們現(xiàn)在公認(rèn)的AjaxStyle。而且在當(dāng)時瀏覽器對于XMLHttpRequest支持不是很完善的時候,他增加或者形成了很多完成這項處理的很多巧妙的方法。他建立了一個網(wǎng)站“RemoteScriptsResources”,并且編寫了一個JavaScriptRemoteScripting(JSRS)庫來支持不同瀏覽器的兼容性。
AlexRussel建立了一個netWindow項目,意圖建立一個支持富UI、可編程、圖形環(huán)境的網(wǎng)頁,同時帶有完全可拖動的窗口和其他小組件,netWindows變成了nWigets,并且最終催生了DojoProject,一個當(dāng)前重要的Ajax框架。
DouglasCrockford一直在研究JavaScript語言的豐富性,***他發(fā)布了一系列有建設(shè)性的文章,例如:TheWorld'sMostMisunderstoodProgrammingLanguage,在這些文章中,他指出了JavaScript在使用中的一些技巧和一些缺點。
Brent、Alex和Doug當(dāng)時的聲音都很薄弱,就像曠野中的呼聲,但是當(dāng)***其他的Web開發(fā)社區(qū)準(zhǔn)備將注意力投向JavaScript的時候,他們所作的這些工作讓我們的生活變得更加簡單了。
我在2000年到2003年中段的時候,對于JavaScript的關(guān)注都只是一些零星的片段,我確實沒有投入太多的關(guān)注,我沉浸在Java的樂土中,閑暇的時候研究一下Ruby,而正是這段經(jīng)歷為我再一次的認(rèn)識JavaScript提供了準(zhǔn)備。
在2003年的6月,我的朋友給我演示了netWindows,當(dāng)我從地板上撿起我的下巴來以后(Afteripickmyjawupoffthefloor,作者還真是幽默),我朋友告訴我說Alex這個人不是瘋子,我如夢方醒開始認(rèn)真的研究JavaScript,現(xiàn)在看來,當(dāng)時Google也有一幫人在做同樣的事情。
偉大的革命
每個看這篇文章的人都應(yīng)該知道一些Ajax***次引爆屏幕的情景,今天我來簡短的說一些完整的情節(jié)。
***個引起我注意的Ajax應(yīng)用是Gmail。很明顯,他先是下載了很多的JavaScript,然后在后臺不斷地與服務(wù)器進行通信,避免頁面的刷新。他確實給人非常深的印象,同時也給其他的技術(shù)團隊帶來不知所措的感覺。我當(dāng)時在想Google一定是有一個非常成熟的定制化工具來開發(fā)如此復(fù)雜的客戶/服務(wù)器端管理。
真正讓我明白的是Google的GoogleSuggest。現(xiàn)在的人一定很熟悉,當(dāng)我們輸入的時候,通過與服務(wù)器的交互將我們可能需要的詞條顯示出來供我們選擇。
GoogleSuggest在兩個方面讓我印象深刻,***是他是如此簡單以至于大多數(shù)的技術(shù)人員都能夠明白他的工作原理并且應(yīng)用到自己的網(wǎng)絡(luò)項目中;另外一個是GoogleSuggest針對用戶的每次keyup事件進行相應(yīng)和通信,讓我看到同服務(wù)器通信是如此的簡單,我完全被折服了。
不久以后又襲來了GoogleMaps,JessJamesGarret形成了Ajax這個術(shù)語,從此以后討論變得更加方便。
從此以后,Ajax變成了我們處理網(wǎng)絡(luò)應(yīng)用的的標(biāo)準(zhǔn)方法。而且現(xiàn)在我們有了更多的工具和第三方庫選擇,但我們又陷入另一個難題:選擇太多了。
停止擔(dān)心,愛上DOM
我已經(jīng)闡明了為什么JavaScript有這個名聲的眾多原因,其中有好的也有壞的,在這眾多的原因中,我只想重復(fù)一條,他是如此重要,能夠解釋為什么很多有經(jīng)驗的程序員經(jīng)給被自己的經(jīng)驗所蒙蔽。
這一部分作者以一個例子來說明了JavaScript的編寫方式和Java是多么的不同,***提出了一些有意義的總結(jié):
Functionsarefirst-classobjects.
Methodsarejustfunctionsattachedtoobjects.
Youcanaddmethodstoclassesatanytime(evenafterinstanceshavebeencreated).
Individualobjectscanhavetheirownmethods.
``Classconstructors''arejustfunctions.
Functions,beingobjects,canhavetheirownproperties.
Youcancallfunctionswithfewer(ormore)argumentsthanthefunctionisdeclaredtotake.
Ifnovalueispassedforafunctionargument,itgetsthevalueundefined.
Javascript總結(jié)
***讓我們每一位JavaScript開發(fā)者來正確的認(rèn)識JavaScript,用它來完成他應(yīng)當(dāng)完成的任務(wù)。
AjaxisagatewaydrugforJavaScript.
【編輯推薦】
- JavaScript類和繼承:prototype屬性
- JavaScript類和繼承:this屬性
- ExtJS Grid Tooltip的3+1種實現(xiàn)方式總結(jié)
- JavaScript異步調(diào)用框架的鏈?zhǔn)綄崿F(xiàn)
- JavaScript異步調(diào)用框架的jQuery風(fēng)格鏈?zhǔn)秸{(diào)用
網(wǎng)頁名稱:討論:是什么讓我們愛上Javascript?
URL地址:http://www.dlmjj.cn/article/dpgseji.html


咨詢
建站咨詢
