為什麼要使用 JavaScript

來源:互聯網
上載者:User

當我還是一個初出茅廬的程式員時,我想掌握自己所用語言的每個特性。我寫程式時會嘗試使用所有的特性。我認為這是炫耀的好方法,而我也的確出了不少風頭,因為我對各個特性了如指掌,誰有問題我都能解答。

最終,我認定這些特性中有一部分特性帶來的麻煩遠遠超出它們的價值。其中,一些特性因為規範很不完善而可能導致可移植性問題,一些特性會導致代碼難以閱讀或修改,一些特性誘使我追求奇技淫巧但卻易於出錯,還有一些特性就是設計錯誤。有時候語言的設計者也會犯錯。

大多數程式設計語言都有精華和糟粕。我發現如果取其精華而棄其糟粕的話,我可以成為一個更好的程式員。畢竟,用壞材料怎麼能做出好東西呢?

標準委員會想要移除一門語言中的缺陷部分,這幾乎是不可能的,因為這樣做會損害所有依賴於那些糟粕的蹩腳的程式。除了在已存在的一大堆缺陷上堆積更多的特性,他們通常無能為力。而且新舊特性並不總是能和諧共處,從而可能產生出更多的糟粕。

但是,你有權力定義你自己的子集。你完全可以基於精華的那部分去編寫更好的程式。

JavaScript 中糟粕的比重超出了預料。它一誕生,就在短到令人吃驚的時間裡被全世界所接受。它從來沒有在實驗室裡被試用和打磨。當它還非常粗糙時,它就被直接整合到網景的Navigator 2 瀏覽器中。隨著 Java的小應用程式(Java applets)的失敗,JavaScript 變成了預設的“Web 語言”。作為一門程式設計語言,JavaScript 的流行幾乎完全不受它的品質的影響。

好在 JavaScript有一些非常精華的部分。在 JavaScript 中,美麗的、優雅的、富有表現力的語言特性就像一堆珍珠和魚目混雜在一起。JavaScript 最本質的部分被深深地隱藏著,以至於多年來對它的主流觀點是:JavaScript 就是一個醜陋的、沒用的玩具。本書的目的就是要揭示 JavaScript 中的精華,讓大家知道它是一門傑出的動態程式設計語言。JavaScript 就像一塊大理石,我要剝落那些不好的特性直到這門語言的真實本質自我顯露出來。我相信我精雕細琢出來的優雅子集大大地優於這門語言的整體,它更可靠、更易讀、更易於維護。

 

這本書不打算全面描述這門語言。反之,它將專註在精華部分,同時會偶爾警告要去避免糟粕部分。這裡將被描述的子集可以用來構造可靠的、易讀的程式,無論規模大小。通過僅專註於精華部分,我們就可以縮短學習時間,增強健壯性,並且還能拯救一些樹木

或許,只學習精華的最大好處就是你可以不必頭痛如何忘記糟粕。忘掉不好的模式是非常困難的。這是一個非常痛苦的工作,我們中的大多數人都會很不願意麵對。有時候,制定語言的子集是為了讓學生更好地學習。但在這裡,我制定的 JavaScript 子集是為了讓專業人員更好地工作。

為什麼要使用JavaScript

JavaScript 是一門重要的語言,因為它是 網頁瀏覽器的語言。它與瀏覽器的結合使它成為世界上最流行的程式設計語言之一。同時,它也是世界上最被輕視的程式設計語言之一。瀏覽器的 API和文件物件模型(DOM)相當糟糕,連累 JavaScript 遭到不公平的指責。在任何語言中處理 DOM 都是一件痛苦的事情,它的規範制定得很拙劣並且實現互不一致。本書很少涉及DOM,我認為寫一本關於 DOM 的精華的書就像執行一項不可能完成的任務。

JavaScript 是 最 被 輕 視 的 語 言 , 因 為 它 不 是 所 謂 的 主 流 語 言 ( SOME OTHER LANGUAGE)。如果你擅長某些主流語言,但卻在一個只支援 JavaScript 的環境中編程,那麼被迫使用 JavaScript 的確是相當令人厭煩的。在這種情形下,大多數人覺得沒必要先去學好 JavaScript,但結果他們會驚訝地發現,JavaScript 跟他們寧願使用的主流語言有很大不同,而且這些不同至為關鍵。

 

JavaScript 令人驚異的事情是,在對這門語言沒有太多瞭解,甚至對編程都沒有太多瞭解的情況下,你也能用它來完成工作。它是一門擁有極強表達能力的語言。當你知道要做什麼時,它還能表現得更好。編程是很困難的事情。絕不應該在懵懵懂懂的狀態下開始你的工作。

分析 JavaScript

JavaScript 建立在一些非常優秀的想法和少數非常糟糕的想法之上。

那些優秀的想法包括函數、弱類型、動態對象和富有表現力的對象字面量標記法。那些糟糕的想法包括基於全域變數的編程模型。

JavaScript 的函數是(主要)基於詞法範圍(lexical scoping)的頂級對象。JavaScript

是第一個成為主流的Lambda語言。實際上,相對於Java而言,JavaScript 與Lisp和Scheme有更多的共同點。它是披著C 外衣的Lisp。這使得JavaScript 成為一個非常強大的語言。

現今大部分程式設計語言中都流行要求強型別。其原理在於強型別允許編譯器在編譯時間檢測錯誤。我們能越早檢測和修複錯誤,付出的代價就越小。JavaScript 是一門弱類型的語言,所以JavaScript 編譯器不能檢測出類型錯誤。這可能讓從強型別語言轉向 JavaScript 的開發人員感到恐慌。但事實證明,強型別並不會讓你的測試工作變得輕鬆。而且我在工作中發現,強型別檢尋找到的錯誤並不是令我頭痛的錯誤。另一方面,我發現弱類型是自由的。我無須建立複雜的類層次,我永遠不用做強製造型,也不用疲於應付類型系統以得到想要的行為。

JavaScript 有非常強大的對象字面量標記法。通過列出對象的組成部分,它們就能簡單地被建立出來。這種標記法是 JSON 的靈感來源,它現在已經成為流行的資料交換格式

原型繼承是 JavaScript中一個有爭議的特性。JavaScript 有一個無類型的(class-free)對象系統,在這個系統中,對象直接從其他對象繼承屬性。這真的很強大,但是對那些被訓練使用類去建立對象的程式員們來說,原型繼承是一個陌生的概念。如果你嘗試對 JavaScript直接應用基於類的設計模式,你將會遭受挫折。但是,如果你學會了自如地使用 JavaScript原型,你的努力將會有所回報。

JavaScript 在關鍵思想的選擇上飽受非議。雖然在大多數情況下,這些選擇是合適的。但是有一個選擇相當糟糕:JavaScript 依賴於全域變數來進行串連。所有編譯單元的所有頂級變數被撮合到一個被稱為全域對象(the global object)的公用命名空間中。這是一件糟糕的事情,因為全域變數是魔鬼,但它們在 JavaScript 中卻是基礎。幸好,我們接下來會看到,JavaScript 也給我們提供了緩解這個問題的處理方法。

在某些情況下,我們可能無法忽略糟粕,還有一些毒瘤難以避免,當涉及這些部分時,我會將它們指出來。它們也被總結在附錄 A 中。但是我們將成功地避免本書中提到的大多數糟粕,它們中的大部分被總結在附錄 B 中。如果你想學習那些糟粕,以及如何拙劣地使用                                                                                          它們,請參閱任何其他的JavaScript 書籍。

《ECMAScript 程式設計語言》第 3 版定義了JavaScript(又稱 JScript)的標準,它可以從http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf獲 得 。

 本書所描述的是ECMAScript的一個特定的子集。本書並不描述整個語言,因為它排除了糟粕的部分。這裡排除得也許並不徹底,迴避了一些極端情況。你也應該這樣,走極端只會帶來風險和苦惱。

附錄 C 描述了一個叫 JSLint的編程工具,它是一個 JavaScript 解析器,它能分析 JavaScript問題並報告它包含的缺點。JSLint 提出了比一般的 JavaScript 開發更嚴格的要求。它能讓你確信你的程式只包含精華部分。

 

JavaScript 是一門反差鮮明的語言。它包含很多錯誤,而且多刺,所以你可能會疑惑:“為什麼我要使用 JavaScript?”有兩個答案。第一個是你沒有選擇。Web 已變成一個重要的應用開發平台,而 JavaScript 是唯一一門所有瀏覽器都可以識別的語言。很不幸,Java 在瀏覽器環境中失敗了,否則想用強型別語言的人就有其他選擇。但是 Java 確實失敗了,而JavaScript 仍在蓬勃發展,這恰恰說明 JavaScript 確有其過人之處。

另一個答案是,儘管JavaScript 有缺陷,但是它真的很優秀。它既輕量級又富有表現力。並且一旦你熟練掌握了它,就會發現函數式編程是一件很有趣的事。

但是為了更好地使用這門語言,你必須知道它的局限。我將會無情地揭示它們,不要因此而氣餒。這門語言的精華足以彌補它的糟粕。

一個簡單的實驗場

如果你有一個 網頁瀏覽器和任意一個文字編輯器,那麼你就有了運行 JavaScript 程式所需要的一切。首先,請建立一個 HTML 檔案,起個名字,比如 program.html:

<html><body><pre><scriptsrc="program.js">

</script></pre></body></html>

接下來,在同一個檔案夾內,建立一個指令檔,比如起名為 program.js:

document.writeln('Hello, world!');

下一步,用你的瀏覽器開啟你的 HTML 檔案查看結果。本書貫徹始終都會用到一個 method方法去定義新方法。下面是它的定義:

Function.prototype.method = function (name, func) {

this.prototype[name] = func;

return this;

};

 

 

本文節選自《JavaScript語言精粹(修訂版)》一書

(美)克羅克福德(Crockford,D.)著

趙澤欣,鄢學鶤譯

電子工業出版社出版

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.