克服JS奇怪的部分_創造與提升、JS 與undefined

Huang Pei
3 min readApr 5, 2019

--

創造與提升/JavaScript 與 undefined

本筆記出自:JavaScript 全攻略:克服 JS 的奇怪部分

提升(Hoisting)

b();  //Called b!
console.log(a); //undefined
var a = ‘Hello World!’;function b() {
console.log(‘Called b!’);
}
逐行執行程式碼之前,JavaScript已經為變數和函數在記憶體中建立一個空間了

當語法解析器執行程式碼,開始設定轉化程式碼時,它會知道你在哪裡創造變數和函數,並在創造階段設定變數和函數在記憶體裡,這個步驟叫做「提升」(hoisting)。

  • 函數:變數和函數已經存在於記憶體中,所以當程式被逐行執行時可以找到它們,函數已經全部在記憶體了,代表函數裡面的程式碼已經被執行了。(比變數優先提升)
  • 變數:JavaScript為a空出記憶體空間時,它不知道a會是什麼值,直到它被執行才知道。因此先放上undefined的替代文字,表示「我還不知道他的值」,如果我們都不設值的話也會得到一樣的替代文字。

結論:所有JavaScript的變數一開始都會被設定為undefined(預設值),然後函數則是完全被設定好放進記憶體中。

whosName();
function whosName() {
if (myName) {
myName = “杰倫”; }}
var myName = “小明”;
console.log(myName); //小明
_____
-創造階段function whosName() { } //優先提升函式
var myName //宣告變數,提升預留為undefined
-執行階段whosName(); //呼叫函數function whosName() {
if (myName) { //此時undefined為false
myName = "杰倫";}} //條件不成立,不賦值
myName = "小明"; //賦值myName = "小明"
console.log(myName); //myName = "小明"

Undefined VS Not defined

  • Undefined: 被宣告過已存在於記憶體中,但尚未被賦值。undefined其實是JavaScript設定的初始值,會佔據記憶體空間的特殊關鍵字。
var a
console.log(a) //undefined
  • Not defined: 未被宣告過,記憶體中根本不存在。
console.log(a) //a is not defined.

--

--

Huang Pei
Huang Pei

Written by Huang Pei

記錄用倉庫,歡迎指正。菜鳥前端,最菜的那種(超能力少女です)。

No responses yet