JavaScript 自執行匿名函式中這個問題是什麼?


假設這裡有一段示例程式碼,我們需要說明這段程式碼可能的輸出並解釋原因。

var name = 'Zakir';
(() => {
   name = 'Rahul';
   return;
   console.log(name);
   function name(){
      let lastName = 'Singh';
   }
})();
console.log(name);

讓我們用一種簡單的方法逐行分析這個問題。

1 → ‘Zakir’ 儲存在變數 name 中。

3 → 我們進入一個自執行匿名函式。

4 → 變數 name 被重新初始化為 ‘Rahul’。

5 → 遇到 return 語句,所以我們退出函式。

15 → 將 name 變數(當前值為 ‘Rahul’)列印到螢幕。

所以,最終輸出將是

Rahul

但是,不幸的是,這是錯誤的。讓我們再次仔細檢查程式碼,這次要記住變數和函式提升的概念。

1 → ‘Zakir’ 儲存在變數 name 中。

3 → 我們進入一個自執行匿名函式。

當我們進入函式時,函式提升生效,在自執行函式底部定義的函式 name() 被提升到自執行函式的頂部。在這個中間狀態,程式碼將類似於:

示例

let name = 'Zakir';
(() => {
   let name;
   name = 'Rahul';
   return;
   console.log(name);
   name = function(){
      let lastName = 'Singh';
   }
})();
console.log(name);

請注意,每當變數/函式被提升到其作用域的頂部時,它只會被定義和初始化,它在其實際位置被初始化,在頂部它是未定義的,但它存在。

因此,當變數 name 被重新初始化時,是區域性變數 name 被重新初始化,而不是全域性變數。之後,我們從自執行函式返回,並將全域性變數 name 列印到控制檯,該變數仍然儲存 ‘Zakir’。因此,輸出將是:

輸出

Zakir

更新於:2020年8月18日

107 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.