你其實並不懂 JavaScript

 


筆者之前曾在 Ideasnow! 上面發表過這篇翻譯文章,最近重看有許多不同的感覺,再加上有些部分之前研究 jQuery 原始碼以及 JavaScript 效能的文章有看過,所以稍微編修了文章再加上了一些個人見解。

偶然在網路上看到這篇文章,覺得很有趣,必須說這篇文章有幾點我不太了解的地方,所以有稍微查了一下,想說乾脆用我自己理解的方式把它翻譯一遍。如果你也恰巧很了解 JavaScript,然後發現我理解錯誤,那請一定要糾正我:)

你其實並不懂 JavaScript

本文翻譯自:http://www.w2lessons.com/2011/04/you-dont-know-javascript.html
This article is translated from: http://www.w2lessons.com/2011/04/you-dont-know-javascript.html
過去一年多來,我發現到一個正在發生的問題,一個令人不是那麼開心的現象。我一再的看到程式設計師在履歷裡面填入他們實際上不是這麼熟悉而只是稍微接觸過的技術。而在那麼多的程式語言中,最常被用來填充在履歷上的正是 JavaScript。

你甚至沒有意識到你不了解 JavaScript

之所以會這樣,大概是因為幾乎每一個 Web 工程師或多或少都會有需要用到 JavaScript 的時候。在沒有完全了解的狀況下,最常看到的學習 JavaScript 的方法是依照需求從網路上隨便找一段 JavaScript 程式碼片段,配合一些間單的編輯之後再進行「剪下與貼上」。這麼一來,工程師從未真正的學習語言可是卻往往會有一種錯覺,自以為自己懂。在經過了一些學習的課程以及 JavaScript 工作了幾年下來之後,我發現在你真正的了解它之前,你並沒有意識到你其實並不懂 JavaScript。看起來這是個惡性循環的問題。而其實你需要的只是有個人來告訴你你並不懂 JS,並且你需要一些真正的學習來了解 JS。時常面試到一些很驕傲的把 JS 列在履歷上的人,但其實僅僅只是做過一些從網路上來的程式碼片段擷取而成的 onClick 的處理函式或是表單驗證的簡單工作。如果有用過或是有一些 JS 框架(例如 JQuery 或 Dojo )的知識的話很好,但是在沒有完全的了解實作這些框架的 JS 的情況下,其實並無法真正的熟悉了解這些 JS 框架。為了展現 JS 的各種組成原理,我把這些概念區分為基本,中等,進階三個等級:

基礎等級包含:

  • 知道基本的 JS 語法,例如迴圈,if 判斷式,try/catch 等。
  • 了解各式函式定義的方法以及指派的方法,包含了解匿名函式的使用。
  • 了解基本的 scope 原則,包含全域 scope (window) 以及物件 scope (不包含 closures)
  • 了解執行 context scope 以及 this 的使用
  • 了解各種生成物件以及宣告物件的方法,包含函式本身也是物件的概念。
  • 了解 JavaScript 的比較運算子的意義,例如 ‘>’,‘<“, “==”, “===”
    • == 與 === 可以稍微簡單解釋一下
      • == 會對運算元做完物件轉換(可能是隱性)之後再來做比較
      • === 則不會做物件轉換,並且必須連同 type 也要相同才會被認為是 equal
  • 物件與陣列生成方式的不同

中階等級包含:

  • 了解 timer 的使用,以及使用的時機以及使用的方式,比如用來當做非同步執行的方法。
    • 譯者之前寫過一篇文章有稍微提到使用 timer 來達到非同步執行的一些技巧
  • 深度了解 callback 以及 function 的使用,例如透過 call 以及 apply 兩個 function 函式來改變 context 以及 function 參數傳遞。
  • 了解  表示法以及eval函式。
  • 了解 ,包含對於效率的影響,以及如何透過 (function(){}()) 達成 。
  • 了解  以及 。

casino livecon i dealer dal vivo. line-height: 24px; margin: 0px 0px 0.8125em; outline: 0px; padding: 0px; vertical-align: baseline;”>進階等級包含:

  • 了解  ‘arguments’ 以及如何利用 ‘arguments’ 以及 ‘arguments.length’ 達成function overloading。以及利用 arguments.callee 產生遞迴呼叫。特別要注意的是 arguments.callee 可能會有點問題因為 ECMAScript 5 Strict Mode 並沒有支援 callee。不過 jQuery以 及 Dojo 都有用到就是了。
  • 進階的 closures 應用,例如 ,,以及 。
  • Function 與 html prototyping(prototype chain),並且知道如何 reuse 既有的 JS Objects 與函式 (例如array)
  • 物件型別,以 及 instanceof 與 typeof 的使用
  • Regular expression
  • with 敘述式,以及為什麼不應該用 with
  • 最難的在於把所有這些串接在一起組成乾淨的強大的快速的好維護並且跨瀏覽器的程式碼
最後這一點尤其重要,並且也最難做到。在JS允許非常自由寬鬆的寫法的狀況下,你的code很容易就會變成一團混亂的無法維護的 ”” (譯註:大概是說你的code邏輯扭扭曲曲而且互相糾纏的意思)。一旦你真正的去學習JS,並且能夠結構化它並且把他們組合成一大型的 Web Application,那你就真的精通 JS 了。而這需要數年的練習,以及可能需要從『錯』中學習,並無法僅僅從書上學到。我自己本身每天使用 JavaScript 好幾個小時已經好幾年了,並且持續的找到一些更好的方法來結構化我的 code。貿然的直接去看一個 JS framework 是很危險的,因為 jQuery code 有點慢慢傾向難以維護的態勢 (譯者:最近有在研究 jQuery 原始碼,的確是很容易在裡面迷失,而且架構稍微不好懂,但至於是不是難以維護就見仁見智)。Dojo 則是提供了些支援透過他的 Class 與 Package 來幫忙結構化 JavaScript 程式碼。
在 Node.js 之後,JavaScript 已經從前端滲透到後端了,所以我決定把web相關的知識從以上的需求區隔開來。就是在 Web (也就是 DOM 與 IE) 這一塊給了 JS 一個不好的名聲,並且嚇到所有的Programmer。儘管如此。如果你正在學習 Web 方面的 JavaScript,身為一個好的開發者,有一些其他的事情你必須知道:
  • 有效率的新增,移除,改變 DOM nodes。包含透過一些工具(例如,)來盡可能減少瀏覽器的 re-flows。
  • 以跨瀏覽器的方式去存取DOM元件的資訊。最後是透過一些既有的 jQuery/Dojo 框架。很重要的是必須了解來自 CSS 或是 style tag 或是運算過後的屬性之中的差異性。
  • 跨瀏覽器的事件處理,繫結,反繫結,事件傳遞 (bubbling),以及如何達到想要的 callback context。一樣,這些最後是透過既有的 framework 來做,但是開發者還是必須瞭解背後的原理。
    • 譯者認為 event bubbling 是ㄧ個很重要的觀念,尤其如果一開始就很習慣使用 jQuery (或其他 framework) 在做 event binding 的時候很容易就忽略掉這一塊,但如果對 event bubbling 不了解的話很容易在 DOM element 有重疊的時候會出現一些自己無法預期,或是明明原本做得到,但卻因為不了解特性而繞路的做法。
  • 擴充物件屬性 (expando) 與屬性設定 (attribute setting) 的差異,包含效能的差異以及既有同名屬性的差異。
    • expando 的效率遠勝於 attribute setting ( 尤其在 IE 上)
  • 用來抽取 DOM node 的 regular expression
    • 其實譯者自己也對 regular expression 不熟 (慚愧)
  • 有效的瀏覽器功能偵測以及適當的防錯機制
從以上的各點看來,JavaScript 除了 alert(myVal 以及 myBtn.onclick=… 之外還有非常多東西。在你的 copy/paste 的來源之外還有許多跟 JavaScript 相關的東西可以學習,而你必須透過閱讀以及練習來成為一個真正的 JavaScript programmer。有兩本很棒的書包含了以上所提到的你必須知道的JavaScript,一本是  大師的著作:,另一本是jQuery作者 的著作: (譯者個人很推這本)。必須說由於每個人都有一個瀏覽器,JavaScript 大概是一個最容易可以取得(使用)的一個語言。建立一個簡單的 HTML 頁面,並且開始測試以上所提到的概念吧!至於履歷上的列表,我會說如果你已經瞭解基本等級的知識並且正往中階等級學習,那你就有資格把 JavaScript 列在你的履歷表上。一旦你開始開發你自己的 JavaScript 函式而不是只是 copy/paste,那麼你大概可以宣稱你懂 JavaScript。不過在那之前,請停止說你懂 JavaScript。
如果我有漏掉任何一個關於 JavaScript 的面向,請回覆讓我知道。並且請分享你的經驗關於任何你遇過宣稱懂得 JS 或是任何語言的人。
請注意到我並不是一個前端開發者,我其實是一個後端的開發者,並且也是  開發者。現今,每一個後端開發者都需要學習 JavaScript,而這也正是我這篇文章想要鼓吹的事情。我並沒有想要顯示我似乎很厲害,因為我很難說我知道關於 JS 的任何一件事情。我想要的只是更多的人可以了解 JavaScript 是一個巨大並且強大的語言。
(Image source: http://ejohn.org/blog/javascript-performance-stack/)


Comments
  1. 回覆
  2. 回覆
  3. yiying wu
    回覆

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *