是什么讓我們愛上Javascript
引子
過去,人們對于Javascript一直報著輕視的態度,人們認為它又慢又容易出錯,而且在不同瀏覽器中解釋也不一樣,但是現在,Javascript確確實實的在改變我們的網絡,越來越多的網絡和APP應用開始使用Javascript。今天,我們就來講講我們為什么會有這種觀念,回顧Javascript的歷史來診斷他的現狀,同時通過一些片段來表明Javascript同其他開發語言的本質不同,唯有如此我們才能明白為何Javascript這么重要。
早期的迷惑
從某種程度上來講,Javascript是Java的惡魔兄弟(Java's evil twin)。他們同歲,都于1995年以Beta的版本出現,并且都在次年1996年推出了1.0版本。在語法上他們也很相近,從名稱上來看他們就像是一家人一樣。
我們第一次聽說Javascript是在1995年,當時Netscape推出了Navigator 2.0的Beta版本,這個版本中沒有包含Javascript,但是有對于Java Applet的支持。同時,Netscape 宣布頁面內嵌的語言LiveScript。
這個聲明并沒有引起太多的注意,在當時Java Applet是一個熱門的技術,當時對于為什么Netscape要在瀏覽器中內嵌兩種語言也不是十分清楚,難道有什么事情LiveScript能做而Java做不了的么?
2個月以后,LiveScript看到了曙光,在Navigator 2.0B3中,它被重新命名為JavaScript。這次改動吸引了眾多人的關注。“Oh,他肯定不能體現他的價值。”、“為什么Sun要讓這么個玩具來搭Java的車?”我至今仍人為這次改名是一個失敗的主意,因為他引起了無盡的困惑,很多非編程人員從來都沒有明白過Java和Javascript是兩個不同的東西。
改名字的另外一個影響是細微的,但是我認為改善了這個語言的接受程度。與Java的關系使這門語言看起來并不是一個全新的東西。事實上,當時Java本身都還不是十分成熟,也還沒有到1.0,但是外界對于Java成熟狀況的認知要比本身高出很多。例如,在1995年,時代雜志將Java選為當年的十大新產品之一。同時,市面上已經有很多關于Java的書籍。所以,當Netscape將這項技術命名為JavaScript,其意圖很明顯就是表明當時的Java開發團體是使用和評價JavaScript的最佳人選。
在懷疑的浪潮中,憑借JavaScript與Java Applet的通信和控制能力,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年的時候可以被稱為有“技術頭腦(Technically Savvy)”的人員站的比重相當的高。所以,這些人便不再依賴于JavaScript,因為這會導致用戶不使用你的網站。
那些使用JavaScript的用戶做的也不夠好。那些嚴謹的程序員完全拋棄了JavaScript,但是設計師和頁面人員補充了進來。早期的書籍中都提供了糟糕的JavaScript實例,但是很少去從語義上對它進行分析、闡述。(David Flanagan是個例外)讓事情更糟糕的是,有些人(也許是大多數人)根據就沒從書中學習過JavaScript,他們只是從一個網站現有的代碼中拷貝,修改,然后粘貼到自己的網站上讓它工作,到最后都不知道為何這些代碼能夠正常運行。
即使大家都是從例子開始學習JavaScript,只要保證兩件事情這也許會成為一個很好的策略。第一個就是大家都學習好的例子,但顯然JavaScript并不屬于這種情況。第二種情況就是這種語言應該和學習它的人所知道的另外一種語言相似,但是很不幸,雖然JavaScript從語義上看來和Java非常相近,但實際上JavaScript來自一個和Java完全不同的編程語言家族。JavaScript是NewtonScript、Self、Smalltalk...和Lisp語言的一個直系后裔。Waldemar Horwat,一位在JavaScript早期產生重大影響的工程人員說,我更愿意把JavaScript認為是Common Lisp的另一種形式。這個說法有些夸張,但是如果你知道這兩種語言,你就會很容易發現兩者之間確實存在很多相似之處。
所以狀況就變的越來越不好,一門與之前廣泛傳播的語言有很大不同的新語言,被一些沒有經驗的編程者推廣,其他的編程人員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年的Ajax Experience的大會上,Dion Almaer和Ben Galbraith做了很多關于XMLHttpRequest的工作,但是在Mozilla第一次引入XMLHttpRequest支持的時候的官方文件中,他的特性根本就沒有提到。
那段時間有很多JavaScript的活動,在JavaScript的支持下,Macromedia為Flash提供了腳本語言支持。Adobe也在不斷努力使他們的很多程序可以使用JavaScript來控制和擴展。Apple將JavaScript嵌入了它的Sherlock應用中。當然,Mozilla項目也做出了一個重要決定,他們大部分的瀏覽器都可以支持JavaScript。很明顯,JavaScript已經不再僅僅是一個網頁語言,而成為了程序中嵌入的動態的、運行時擴展的編程語言的首選。其中的原因也許是當時大家或多或少的都會一些JavaScript,還有當時存在兩個高質量的嵌入擴展(SpiderMonkey c語言編寫,Rhino Java語言編寫)。
在2000年的時候,一些人(著名的Brent Ashley、Alex Russell、Douglas Crockford)開始注意到JavaScript究竟能做什么。Brend開始研究JavaScript與服務器通信的方法,提出了我們現在公認的Ajax Style。而且在當時瀏覽器對于XMLHttpRequest支持不是很完善的時候,他增加或者形成了很多完成這項處理的很多巧妙的方法。他建立了一個網站“Remote Scripts Resources”,并且編寫了一個JavaScript Remote Scripting (JSRS)庫來支持不同瀏覽器的兼容性。
Alex Russel建立了一個netWindow項目,意圖建立一個支持富UI、可編程、圖形環境的網頁,同時帶有完全可拖動的窗口和其他小組件,netWindows變成了nWigets,并且最終催生了Dojo Project,一個當前重要的Ajax框架。
Douglas Crockford一直在研究JavaScript語言的豐富性,最后他發布了一系列有建設性的文章,例如:The World's Most Misunderstood Programming Language,在這些文章中,他指出了JavaScript在使用中的一些技巧和一些缺點。
Brent、Alex和Doug當時的聲音都很薄弱,就像曠野中的呼聲,但是當最后其他的Web開發社區準備將注意力投向JavaScript的時候,他們所作的這些工作讓我們的生活變得更加簡單了。
我在2000年到2003年中段的時候,對于JavaScript的關注都只是一些零星的片段,我確實沒有投入太多的關注,我沉浸在Java的樂土中,閑暇的時候研究一下Ruby,而正是這段經歷為我再一次的認識JavaScript提供了準備。
在2003年的6月,我的朋友給我演示了netWindows,當我從地板上撿起我的下巴來以后(After i pick my jaw up off the floor,作者還真是幽默),我朋友告訴我說Alex這個人不是瘋子,我如夢方醒開始認真的研究JavaScript,現在看來,當時Google也有一幫人在做同樣的事情。
偉大的革命
每個看這篇文章的人都應該知道一些Ajax第一次引爆屏幕的情景,今天我來簡短的說一些完整的情節。
第一個引起我注意的Ajax應用是Gmail。很明顯,他先是下載了很多的JavaScript,然后在后臺不斷地與服務器進行通信,避免頁面的刷新。他確實給人非常深的印象,同時也給其他的技術團隊帶來不知所措的感覺。我當時在想Google一定是有一個非常成熟的定制化工具來開發如此復雜的客戶/服務器端管理。
真正讓我明白的是Google的Google Suggest。現在的人一定很熟悉,當我們輸入的時候,通過與服務器的交互將我們可能需要的詞條顯示出來供我們選擇。
Google Suggest在兩個方面讓我印象深刻,第一是他是如此簡單以至于大多數的技術人員都能夠明白他的工作原理并且應用到自己的網絡項目中;另外一個是Google Suggest針對用戶的每次keyup事件進行相應和通信,讓我看到同服務器通信是如此的簡單,我完全被折服了。
不久以后又襲來了Google Maps,Jess James Garret形成了Ajax這個術語,從此以后討論變得更加方便。
從此以后,Ajax變成了我們處理網絡應用的的標準方法。而且現在我們有了更多的工具和第三方庫選擇,但我們又陷入另一個難題:選擇太多了。
停止擔心,愛上DOM
我已經闡明了為什么JavaScript有這個名聲的眾多原因,其中有好的也有壞的,在這眾多的原因中,我只想重復一條,他是如此重要,能夠解釋為什么很多有經驗的程序員經給被自己的經驗所蒙蔽。
這一部分作者以一個例子來說明了JavaScript的編寫方式和Java是多么的不同,最后提出了一些有意義的總結:
Functions are first-class objects.
Methods are just functions attached to objects.
You can add methods to classes at any time (even after instances have been created).
Individual objects can have their own methods.
``Class constructors'' are just functions.
Functions, being objects, can have their own properties.
You can call functions with fewer (or more) arguments than the function is declared to take.
If no value is passed for a function argument, it gets the value undefined.
總結
最后讓我們每一位JavaScript開發者來正確的認識JavaScript,用它來完成他應當完成的任務。
Ajax is a gateway drug for JavaScript.
[參考資料]
1、Learn To love Javascript: http://vanderburg.org/Writing/LearningToLoveJavaScript/
2、NewtonScript: http://en.wikipedia.org/wiki/NewtonScript
3、Java In Best Top Ten of 1995: http://www.time.com/time/magazine/article/0,9171,983903,00.html