iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
自我挑戰組

I don't know JS yet系列 第 23

[ Day 23 ] I don't know JS yet - Shadowing

  • 分享至 

  • xImage
  •  

今天要學習的是 Shadowing,這是 Scope & Closure CH.3 的內容,一起來看看 Scope 與 shadowing 之間有什麼關聯。

先看這段程式碼

var studentName = "Suzi";

function printStudentName(studentName) {
  studentName = studentName.toUpperCase();
  console.log(studentName);
}

printStudentName("Frank");     // FRRANK
printStudentName(studentName); // SUZI
console.log(studentName);      // Suzi

第一行由 const 宣告的 studentName 形成了一個 scope,我們暫且標記它為 RED(1);
接著 function 的參數 studentName 形成了另外一個 scope,我們標記它為 BLUE(2);
在 function 裡所有的 studentName 都是 reference 到 BLUE(2) (因為作用域的關係);

重點來了,我們知道 variable look up 會向上、向外尋找有沒有匹配的 variable,但在上面的情形 function 的參數 studentName 與更向上一層的 RED(1) studentName 有同樣的名稱,因此 function 裡所有的 studentName 完全不可能 reference 到 RED(1) studentName;
上面的情況及稱作 shadowing

BLUE(2) 的 studentName shadowing RED(1) 的 studentName,因為 shadowing,function 裡 studentName 的 re-assignment 不會影響到 RED(1) 的 studentName;

總結:
倘若今天有個變數 shadowing 外層的 (shadowed) 變數(就像 studentName),shadowing 的變數不會影響到外層的(shadowed)變數,因為在 reference 到外層的變數之前,一定會先 reference 到 shadowing 的變數,因爲如此 console.log(studentName) 回傳的是 Suzi,而不是 SUZI


上一篇
[ Day 22 ] I don't know JS yet
下一篇
[ Day 24 ] I don't know JS yet - function name scope
系列文
I don't know JS yet30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言