將JavaScript 作為第一程式語言

ourjs發表於2014-04-26

  (注:之前分享過: 為什麼我不建議你將JavaScript作為主力語言 ,可以看出,有過豐富程式設計經驗的程式設計師是很難一下子接受JS的繼承方式的,不過這篇文章則表達了對JS語法風格的喜愛)

  在可汗學院(Khan Academy),我們一直在調查使用一些新的有趣的方法教學生們電腦科學。其中最有趣的是我們趨向於教他們JavaScript作為他們的第一程式語言。

  我們在一個非常獨特的地位,因為我們的初衷是教那些已經通過我們之前的數學和Science-centric 課程的學生。因為這樣我們可以創造一些相當引人注目的活動和專案,而這些是其他人無法做到的。

  以JavaScript作為第一程式語言教學的前景事實上是很令人振奮的。

  給有經驗的經典繼承開發者教原型繼承一般是很令人沮喪的(因此導致很多JavaScript庫如雨後春筍般湧現,這些庫試圖複製JavaScript中的經典繼承模式,這種模式完全是一個不可思議的in和of領域)。教那些之前從來沒有看到過任何繼承方式的開發者原型繼承明顯是一件容易的事。和教函式程式設計是一樣的。JavaScript是一門強大的語言,我們可以從中體驗函式程式設計而且可以最終成為我們的課程焦點。

  當我們已經開始著眼於JavaScript作為第一程式語言的前景,一些bug顯現出來(這對那些已經有過一些JavaScript開發經驗的開發者來說是顯然的)。為了確保一般的bug不突然出現,我們將要在編輯器中使用一些程式碼驗證格式(JSLint,JSHint或者similar)給使用者上下文關聯的資訊,比如他們的程式碼發生了什麼,為什麼他們必須得用一種確定的格式寫他們的程式碼。

  然而我們想要越過基本的語法調整找到可以更容易的使用這種語言的方式。這裡詳細的列出了兩個變化可能讓你輕鬆入門。

  注意 : 如果你正在教一些之前從來沒看到這種語言而且確實只用一組特定的、編寫良好的庫程式設計的人,那麼這些特別的建議只會在這種情況下適用。當然,為了讓學生們達到“看到任何隨機的跨瀏覽器JavaScript程式碼片段並且理解它的作用”這種水平,還需要交給他們更多。

  強制型別裝換

  強制型別轉換完全是一團糟,就如很多人所指出的,道格拉斯Crockford教過的還有《JavaScript語言精髓》這本書中所講。

  可能在教育週期很久之後在討論這個比較有意義,就像學習原型,函式程式設計和閉包之後。基本上,在一切之後,強制型別轉換實際上是很重要的。

name==="John"

  我推薦的第一個變化就是學生只看到和使用,===(和!==)。當使用‘==’確實有句法上簡短的優點,但是附加有太多的強制轉換的負累,讓在程式設計學習中嘗試儘早教學成為徒勞之舉。

  一個值得以後教的異常就是在你期望看到一個變數是否是空值(null)或未定義(undefined)的情況下,這可以通過一個簡單的驗證:someVar==null輕鬆地做到,也是==的有用的案例。(另外一個值得注意的異常是IE瀏覽器小錯誤,===檢查和Window物件衝突總是會返回false,但是,在我們的課程中覆蓋像這樣的特殊瀏覽器問題是不太可能的)

  Falsy值

  出於和==一團糟同樣的原因,falsy 值也是一團糟。強制執行嚴格的的布林檢查將導致更少的邊界情況但是也必然導致跟多的程式碼量。可能falsy值的教學可以限制在布林值,null值,和undefined. 而剩下數字型別和String型別作為之後的練習。

  函式宣告

  或許, 我們能做的最有趣的變化是非常微妙的,但是這是為建立匿名函式避開正常的函式宣告並將它們分配給一個變數。

// 不要這樣做:
function getData(){ }
// 而應該這樣做:
var getData = function(){ }

  當你使用這項特別的技術時,下面列出了一些好的習慣可以灌輸給他們。

  · 讓理解 “函式是一個物件”更容易。我發現當你給新開發者展示將一個函式賦給一個變數時,函式事實上是一個物件瞬間就會變得很明顯,而且可以這樣操作(一個函式可以作為一個引數傳遞給另一個函式)。這樣,學生們可以更好地理解函式程式設計。

  · 強調好的打分號的習慣,傳統的函式宣告只有在分號不需要的情況下使用(一般是儲存條件宣告和迴圈),而且當他們一直被需要的時候它會更加明顯。

  · 不要有太多和傳統的函式和域相關的包袱。

  塊作用域

  要引導學生去理解這個僅存的區域毋庸置疑是一個挑戰,到現在我還沒有找到一個很好地解決辦法。變數宣告在for迴圈提升的問題足以讓大多數開發人員頭暈目眩。我得看看我們不能想出一些直觀的方式解釋變數宣告是如何工作的(將它與警惕的lint檢查結合執行)而不是一個純粹的技術解決方案。

(While (function(){ ... })(); 

  是一個我很懷疑的辦法,我們可以儘早教那讓它有價值。

  JavaScript 作為第一程式語言

  我們應該注意當我們把JavaScript作為第一程式語言很大程度上源於他的普遍性,更多勞動力的需求,安裝要求的缺乏和創造易於和朋友分享的東西的能力的時候,我們不是目光短淺值專注於JavaScript。我們可以從其他的語言學到很多,更不用說和瀏覽器的並不十分相關的JavaScript的整個一套技能, 我們有必要儘可能嘗試讓更多的人加入到我們的課程中來。

  在下面的視訊中我較多的談論我們使用JavaScript的選擇以及我們在開發中將要支援的瀏覽器。

  和大家一樣,我想避免那些可能導致跨瀏覽器怪異問題出現的特徵。因此,我們將廣泛使用庫(為畫canvas圖或操作DOM)而且只用在我們最終支援的瀏覽器上都表現一致的JavaScript語言特徵。

  原文 ejohn.org

相關文章