程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> 討論:是什麼讓我們愛上Javascript?

討論:是什麼讓我們愛上Javascript?

編輯:關於JSP

今天,我們就來講講我們為什麼會有這種觀念,回顧Javascript的歷史來診斷他的現狀,同時通過一些片段來表明Javascript同其他開發語言的本質不同,唯有如此我們才能明白為何Javascript這麼重要。

早期的迷惑

從某種程度上來講,Javascript是Java的惡魔兄弟(Java'seviltwin)。他們同歲,都於1995年以Beta的版本出現,並且都在次年1996年推出了1.0版本。在語法上他們也很相近,從名稱上來看他們就像是一家人一樣。

我們第一次聽說Javascript是在1995年,當時Netscape推出了Navigator2.0的Beta版本,這個版本中沒有包含Javascript,但是有對於JavaApplet的支持。同時,Netscape宣布頁面內嵌的語言LiveScript。這個聲明並沒有引起太多的注意,在當時JavaApplet是一個熱門的技術,當時對於為什麼Netscape要在浏覽器中內嵌兩種語言也不是十分清楚,難道有什麼事情LiveScript能做而Java做不了的麼?

2個月以後,LiveScript看到了曙光,在Navigator2.0B3中,它被重新命名為JavaScript。這次改動吸引了眾多人的關注。“Oh,他肯定不能體現他的價值。”、“為什麼Sun要讓這麼個玩具來搭Java的車?”我至今仍人為這次改名是一個失敗的主意,因為他引起了無盡的困惑,很多非編程人員從來都沒有明白過Java和Javascript是兩個不同的東西。

改名字的另外一個影響是細微的,但是我認為改善了這個語言的接受程度。與Java的關系使這門語言看起來並不是一個全新的東西。事實上,當時Java本身都還不是十分成熟,也還沒有到1.0,但是外界對於Java成熟狀況的認知要比本身高出很多。例如,在1995年,時代雜志將Java選為當年的十大新產品之一。同時,市面上已經有很多關於Java的書籍。所以,當Netscape將這項技術命名為JavaScript,其意圖很明顯就是表明當時的Java開發團體是使用和評價JavaScript的最佳人選。

在懷疑的浪潮中,憑借JavaScript與JavaApplet的通信和控制能力,JavaScript開始出現在一些應用中。所以,那些對Java感興趣的人開始覺得有了學習JavaScript的必要。

Javascript就像一個玩具,它是面向對象的,所有的東西都是公有的,沒有封裝。另外,你無法創建真正的子類,在實例變量和方法之間並沒有真正的區別,這就像一個災難。你可以在任何時候將一個變量變成一個方法。在這方面我並不是孤獨的,雖然對於面向對象的細節每個人的理解都有所不同,但是Java程序員幾乎無一例外的認為,JavaScript並不是一門嚴肅的編程語言,我們也不像用它來做些什麼。

附加的傷害

在早期的時候,JavaScript並沒有什麼真正的技術問題,它是緩慢又充滿風險的,並且只在Netscape下工作。後來IE也支持了,但並不是完全兼容。人們吹捧他用來編寫頁面的applets,但是它並不能檢測applet的失敗。它從來沒有被廣泛的使用過,很快他就成為了一個分母,人們僅僅用它來完成那些可靠的任務,並且避免在其他的地方使用。

什麼是JavaScript能夠可靠的支持的?閃動的、基於圖像的視覺效果。人們開始制造一些炫目的效果。Netscape引導了這個趨勢,在頁面中使用令人生厭的圖層干擾了人們對正常內容的浏覽。那些各種各樣閃動、滾動的效果讓我們認為這個標簽簡直就是網絡的原罪。到處都充斥著閃動的Banner、滾動的Banner、狀態欄裡跳動的文字、隨時可能彈出的對話框、...各種各樣的濫用還在不斷繼續。Miscorsoft也開始談論DHTML,但是不久DHTML就變成了Buggy、Slow、Unmaintable網站的代名詞。

對了,不要忘記安全問題。一般來講,當你構建一個圖靈完備(Turing-Complete)的編程語言時,你就需要特別小心安全問題。Netscape做的不夠好,早期的Javascript中存在漏洞,而且花了很長時間才完全解決掉。

結果是什麼?很多的有技術頭腦的用戶關閉了浏覽器的Javascript支持。要知道,在1996年的時候可以被稱為有“技術頭腦TechnicallySavvy)”的人員站的比重相當的高。所以,這些人便不再依賴於JavaScript,因為這會導致用戶不使用你的網站。

那些使用JavaScript的用戶做的也不夠好。那些嚴謹的程序員完全拋棄了JavaScript,但是設計師和頁面人員補充了進來。早期的書籍中都提供了糟糕的JavaScript實例,但是很少去從語義上對它進行分析、闡述。DavidFlanagan是個例外)讓事情更糟糕的是,有些人也許是大多數人)根據就沒從書中學習過JavaScript,他們只是從一個網站現有的代碼中拷貝,修改,然後粘貼到自己的網站上讓它工作,到最後都不知道為何這些代碼能夠正常運行。

即使大家都是從例子開始學習JavaScript,只要保證兩件事情這也許會成為一個很好的策略。第一個就是大家都學習好的例子,但顯然JavaScript並不屬於這種情況。第二種情況就是這種語言應該和學習它的人所知道的另外一種語言相似,但是很不幸,雖然JavaScript從語義上看來和Java非常相近,但實際上JavaScript來自一個和Java完全不同的編程語言家族。JavaScript是NewtonScript、Self、Smalltalk...和Lisp語言的一個直系後裔。WaldemarHorwat,一位在JavaScript早期產生重大影響的工程人員說,我更願意把JavaScript認為是CommonLisp的另一種形式。這個說法有些誇張,但是如果你知道這兩種語言,你就會很容易發現兩者之間確實存在很多相似之處。

所以狀況就變的越來越不好,一門與之前廣泛傳播的語言有很大不同的新語言,被一些沒有經驗的編程者推廣,其他的編程人員Follow了他們的例子。更多的用戶基於安全考慮關閉了JavaScript的支持,還有有經驗的程序員推薦大家避免使用JavaScript。

上面的這些還不夠,浏覽器大戰似乎一觸即發,兒JavaScript被選作了一種武器。戰爭中的雙方都不斷的發展JavaScript,有時候甚至故意引入了很多不兼容特性。JavaScript此時已經變得更龐大,但同時也更容易引起問題。

也難怪沒有人會喜歡她。

帝國的重建

在那段時間,我還是不斷聽到更多關於JavaScript的消息。關於基於prototype和面向對象的特性的介紹總是讓我很好奇,我曾經看到過的教材裡從來沒有提到過這些,也許是作者本人也沒有必要的語言背景去將這些概念聯系起來。同時,人們開始指出由於浏覽器造成了多少錯誤,而不是JavaScript本身。

後來,IE贏了,Netscape投降了,這一階段的浏覽器大戰結束了。Miscrosoft開始將他們的bug光芒覆蓋到CSS領域任何處理過IE6下頁面開發的工程師都應該深有感受),而Mozila的團隊則開始認真的考慮兼容性的問題。除了一些根深蒂固的區別,想要修改他們必須大量的修改源碼,這個小組修復大多數的不同,於是IE和Mozilla/Firefox下的JavaScript變得更可控了。其他的開發者也更加的有跡可循。

JavaScript和浏覽器的內置支持開始進入了一段穩固的發展時期。在我們大家都忙著寫自己的JavaScript代碼的時候,幾乎沒有人注意到一個具有傳奇色彩的特性引入-XMLHttpRequest。最重要的DHTML特性,Ajax的重要部分,悄悄的加入到了IE中來。Microsoft的Outlook小組引入了這個ActiveX控件來使Outlook支持網絡訪問。200年的AjaxExperience的大會上,DionAlmaer和BenGalbraith做了很多關於XMLHttpRequest的工作,但是在Mozilla第一次引入XMLHttpRequest支持的時候的官方文件中,他的特性根本就沒有提到。

那段時間有很多JavaScript的活動,在JavaScript的支持下,Macromedia為Flash提供了腳本語言支持。Adobe也在不斷努力使他們的很多程序可以使用JavaScript來控制和擴展。Apple將JavaScript嵌入了它的Sherlock應用中。當然,Mozilla項目也做出了一個重要決定,他們大部分的浏覽器都可以支持JavaScript。很明顯,JavaScript已經不再僅僅是一個網頁語言,而成為了程序中嵌入的動態的、運行時擴展的編程語言的首選。其中的原因也許是當時大家或多或少的都會一些JavaScript,還有當時存在兩個高質量的嵌入擴展SpiderMonkeyc語言編寫,RhinoJava語言編寫)。

在2000年的時候,一些人著名的BrentAshley、AlexRussell、DouglasCrockford)開始注意到JavaScript究竟能做什麼。Brend開始研究JavaScript與服務器通信的方法,提出了我們現在公認的AjaxStyle。而且在當時浏覽器對於XMLHttpRequest支持不是很完善的時候,他增加或者形成了很多完成這項處理的很多巧妙的方法。他建立了一個網站“RemoteScriptsResources”,並且編寫了一個JavaScriptRemoteScripting(JSRS)庫來支持不同浏覽器的兼容性。

AlexRussel建立了一個netWindow項目,意圖建立一個支持富UI、可編程、圖形環境的網頁,同時帶有完全可拖動的窗口和其他小組件,netWindows變成了nWigets,並且最終催生了DojoProject,一個當前重要的Ajax框架。

DouglasCrockford一直在研究JavaScript語言的豐富性,最後他發布了一系列有建設性的文章,例如:TheWorld'sMostMisunderstoodProgrammingLanguage,在這些文章中,他指出了JavaScript在使用中的一些技巧和一些缺點。

Brent、Alex和Doug當時的聲音都很薄弱,就像曠野中的呼聲,但是當最後其他的Web開發社區准備將注意力投向JavaScript的時候,他們所作的這些工作讓我們的生活變得更加簡單了。

我在2000年到2003年中段的時候,對於JavaScript的關注都只是一些零星的片段,我確實沒有投入太多的關注,我沉浸在Java的樂土中,閒暇的時候研究一下Ruby,而正是這段經歷為我再一次的認識JavaScript提供了准備。

在2003年的6月,我的朋友給我演示了netWindows,當我從地板上撿起我的下巴來以後Afteripickmyjawupoffthefloor,作者還真是幽默),我朋友告訴我說Alex這個人不是瘋子,我如夢方醒開始認真的研究JavaScript,現在看來,當時Google也有一幫人在做同樣的事情。

偉大的革命

每個看這篇文章的人都應該知道一些Ajax第一次引爆屏幕的情景,今天我來簡短的說一些完整的情節。

第一個引起我注意的Ajax應用是Gmail。很明顯,他先是下載了很多的JavaScript,然後在後台不斷地與服務器進行通信,避免頁面的刷新。他確實給人非常深的印象,同時也給其他的技術團隊帶來不知所措的感覺。我當時在想Google一定是有一個非常成熟的定制化工具來開發如此復雜的客戶/服務器端管理。

真正讓我明白的是Google的GoogleSuggest。現在的人一定很熟悉,當我們輸入的時候,通過與服務器的交互將我們可能需要的詞條顯示出來供我們選擇。

GoogleSuggest在兩個方面讓我印象深刻,第一是他是如此簡單以至於大多數的技術人員都能夠明白他的工作原理並且應用到自己的網絡項目中;另外一個是GoogleSuggest針對用戶的每次keyup事件進行相應和通信,讓我看到同服務器通信是如此的簡單,我完全被折服了。

不久以後又襲來了GoogleMaps,JessJamesGarret形成了Ajax這個術語,從此以後討論變得更加方便。

從此以後,Ajax變成了我們處理網絡應用的的標准方法。而且現在我們有了更多的工具和第三方庫選擇,但我們又陷入另一個難題:選擇太多了。

停止擔心,愛上DOM

我已經闡明了為什麼JavaScript有這個名聲的眾多原因,其中有好的也有壞的,在這眾多的原因中,我只想重復一條,他是如此重要,能夠解釋為什麼很多有經驗的程序員經給被自己的經驗所蒙蔽。

這一部分作者以一個例子來說明了JavaScript的編寫方式和Java是多麼的不同,最後提出了一些有意義的總結:

Functionsarefirst-classobjects.

Methodsarejustfunctionsattachedtoobjects.

Youcanaddmethodstoclassesatanytime(evenafterinstanceshavebeencreated).

Individualobjectscanhavetheirownmethods.

``Classconstructors''arejustfunctions.

Functions,beingobjects,canhavetheirownproperties.

Youcancallfunctionswithfewer(ormore)argumentsthanthefunctionisdeclaredtotake.

Ifnovalueispassedforafunctionargument,itgetsthevalueundefined.

Javascript總結

最後讓我們每一位JavaScript開發者來正確的認識JavaScript,用它來完成他應當完成的任務。

AjaxisagatewaydrugforJavaScript.

  1. JavaScript類和繼承:prototype屬性
  2. JavaScript類和繼承:this屬性
  3. ExtJS Grid Tooltip的3+1種實現方式總結
  4. JavaScript異步調用框架的鏈式實現
  5. JavaScript異步調用框架的jQuery風格鏈式調用

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved