JavaScript 核心筆記
JavaScript 物件的原型,在使用者層面的程式碼看到的是 __proto__
屬性,在語言內部是 [[prototype]]
屬性。 aConstructorFn.prototype
是指原型鏈。
一個物件的原型是一個物件,或者是 null。Object 這個物件的原型鏈的原型( Object.prototype.__proto__
)是 null
。
所以一個預設的物件不是空的,因為繼承了 Object.prototype
的屬性,如果需要建立一個無屬性的空物件,需要顯式把其原型設為 null
,這可以通過 Object.create(null)
或 anObj.__proto__ = null
來設定。
每個執行上下文(execution context)都有一個關聯的詞法環境,其堆疊是一個先進先出的佇列,維護控制流和執行順序。
函式式第一級別(First-class function)意味著函式可以被被當作普通資料來使用,如儲存為變數,作為引數傳遞和作為函式返回值。
自由變數(Free variable)是指不是引數也不是函式內區域性變數的變數。這涉及到自由變數中取定義時的環境的值還是執行時的環境的值?JavaScript 中是取定義時的,即看原始碼即可確定(靜態作用域 static scope)。
JavaScript 中除了 this
,其餘都是靜態作用域。
//(把函式作為引數)downwards funarg problem let x = 10; function foo() { console.log(x); } function bar(funArg) { let x = 20; funArg(); // 10, not 20! } // Pass `foo` as an argument to `bar`. bar(foo);
// (返回函式)upwards funarg problem function foo() { let x = 10; // Closure, capturing environment of `foo`. function bar() { return x; } // Upward funarg. return bar; } let x = 20; // Call to `foo` returns `bar` closure. let bar = foo(); bar(); // 10, not 20!
閉包是指包含了定義時的環境的函式。理論上所有函式都是,但如果一個函式沒使用到自由變數,那麼實際上可以優化掉這個外部環境。
參考
- ofollow,noindex" target="_blank">JavaScript. The Core: 2nd Edition
- Javascript’s Pseudo Classical Inheritance diagram