前言:
一直想要把自己的學習筆記整理整理,至少在寫下筆記的時候,也能釐清觀念。
結果拖延到現在,終於要提筆了,不知道能堅持多久(???)。
從定義開始,
首先來看 MDN 的定義:
JavaScript (JS) is a lightweight interpreted (or just-in-time compiled) programming language with first-class functions. While it is most well-known as the scripting language for Web pages, many non-browser environments also use it, such as Node.js, Apache CouchDB and Adobe Acrobat. JavaScript is a prototype-based, multi-paradigm, single-threaded, dynamic language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles.
我完全看不懂,來拆解一下:
Interpreted or just-in-time compiled 即時編譯語言
即時編譯語言結合了直譯式 & 編譯式的特點,讓 JS 在程式執行期間進行編譯,提升了執行速度。
編譯的步驟大致上長這樣:
- 解析/讀取程式碼
- 編譯成 machine code(第一次編譯成未優化版本)
- 執行 machine code(在 Call Stack 中執行)
- 執行期間 在後台優化並重新編譯 優化後取代原版本繼續執行
而 JS 擁有直譯式語言的特性,所以它無法獨立執行,只能在執行環境 Runtime 中使用。
Runtime
也可以稱為執行環境(有人比擬成工作室,我覺得很適合)
工作室(runtime)中放了 JS engine,以及這間工作室需要的工具。
最常見的 runtime 就是瀏覽器,包含了 JS engine、web APIs、cb queue;
另一種 runtime 是 Node.js,包含了 JS engine、C++ binding with thread pool、cb queue。
所以在 Node.js 中無法使用瀏覽器提供一些函式。
First-class functions 一級函式
在 JS 中,函式可以作為別的函式的參數、函式的返回值,賦值給變數或存儲在資料結構中,也就是說:
- Functions 類型上是一種 object
- Functions 有屬性
- 可以被視為值、被儲存成變數
- 可以傳遞給其他 functions 使用
- 可以從其他 functions 返回 functions(好饒舌)
- 可以在 functions 上呼叫方法
Prototype-based 基於原型的編程
- 從原型(藍圖)建立物件,並從中繼承方法,因此可以使用該方法。
Multi-paradigm 多範型程式語言
可以使用想要的編程風格來寫程式,這讓 JavaScript 非常靈活。
- Procedural programming - 線性式編程
- Object-oriented programming - OOP 物件導向編程
- Functional programming - FP 函式編程
Single-threaded 單線程語言
- JS 是單線程語言,所有的程式碼片段都會在堆疊中(stack)被執行,一次只會執行一個程式碼。
Dynamically-typed language 動態語言
- 不用手動宣告資料型態
- 重新賦值時,變數的資料型態可以更改。
- 類型檢查發生在運行時或執行時
先簡短解釋一下,因為字數有點太多了,
之後再一一擊破。(絕對不是懶惰!)