JS 學習筆記 #2 - 閉包 Closure

更新於 發佈於 閱讀時間約 2 分鐘

在談到閉包前,要先談談範圍鏈

範圍鏈 Scope Chain

在 ES6 以前,變數透過 var 宣告,當時切分變數的最小單位為「函式」,有以下特性需要留意:

  • 內層可以取得外層的變數,但外層無法取得內層變數
  • 在「定義」函式時就決定了範圍鏈,而非執行時

💥 範圍鏈地雷

  • 確認範圍是否有使用 function 切分
  • 若沒有宣告變數,即使在函式內,都會變成全域變數(最外層)

範例

let a = "A";

function fn1() {
let b = "B";
fn2();

function fn2() {
let c = "C";
//可以取得外層所有變數
console.log(a, b, c);
}
}

fn1();
//error,因為無法取得 b,c 變數
console.log(a, b, c);


認識完範圍鏈,就來看看閉包吧!

閉包 Closure

用途

  • 可避免產生全域變數,同時避免開發者變數命名衝突,是透過「內層可以向外取得外層變數、外層無法取得內層變數」的特性達成,也就是範圍鏈的概念
  • 當內部函式回傳時,等同取得內部函式當下環境的變數值(可以取得外層函式的變數值

作法

假設 a 是外部函式,b 是存在於 a 裡面的內部函式

  1. b 不會有自己的變數,但因為作用域的原理,可以取得 a 的變數
  2. 設定 a 函式會呼叫 b,就可以在 b 裡面針對 a 建立的變數進行操作,避免全域變數產生
  3. 之後開發者只需呼叫 a ,a 就會去呼叫 b

範例

以往做計數器時,會在全域環境宣告一個變數來記錄數字,會出現全域變數,造成多個開發者之間命名衝突

//全域變數
let count = 0;

function add() {
return ++count;
}

console.log(add());

使用閉包寫法

function addFunc() {
let count = 0;
function add() {
return ++count;
}
return add;
}

//addFunc() 會回傳 add() 整個 function
//之後呼叫 result 等同於呼叫 add() 這個內部函式
let result = addFunc();
console.log(result());

注意:若缺少 let result = addFunc() 這個動作,直接寫 addFunc(),回傳的會是 add 整個 function,而不是計算結果

希望看完這篇有更認識閉包這個觀念,若有錯誤也歡迎指正,謝謝看到這裡的大家。

留言
avatar-img
留言分享你的想法!
avatar-img
傑米的沙龍
7會員
30內容數
正在一點一滴學習程式,相信知識量總有一天會匯聚成大海,目前專門研究前端中。
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
這篇文章,會帶著大家複習以前學過的前綴和框架, 並且以區間和的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 前綴和 prefix sum框架 與 區間和計算的關係式 接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目 (請讀者、或觀眾
Thumbnail
這篇文章,會帶著大家複習以前學過的前綴和框架, 並且以區間和的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 前綴和 prefix sum框架 與 區間和計算的關係式 接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目 (請讀者、或觀眾
Thumbnail
這一篇會介紹非常重要的 JavaScript 函式概念 - 高階函式(Higher-order function),高階函數是將一個或多個函數作為參數,或將一個函數作為結果返回的函數。在本文中,我們將深入探討什麽是高階函數、使用高階函數的好處以及如何在實際應用中使用高階函數,函式導向是什麼?
Thumbnail
這一篇會介紹非常重要的 JavaScript 函式概念 - 高階函式(Higher-order function),高階函數是將一個或多個函數作為參數,或將一個函數作為結果返回的函數。在本文中,我們將深入探討什麽是高階函數、使用高階函數的好處以及如何在實際應用中使用高階函數,函式導向是什麼?
Thumbnail
👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變
Thumbnail
👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變
Thumbnail
1 Down the rabbit hole: 論理型 掉下兔子洞 七 現在讓我們再簡述一下前面強調過的幾個要點: 如果我們在兩件事態 (表達為兩個句子) 之間建立一個假設性的關係﹐及用條件句式 (前件 + 後件) 表述﹔ 並且﹐如果我們接受前件﹔ 那麼﹐我們即被條件句式
Thumbnail
1 Down the rabbit hole: 論理型 掉下兔子洞 七 現在讓我們再簡述一下前面強調過的幾個要點: 如果我們在兩件事態 (表達為兩個句子) 之間建立一個假設性的關係﹐及用條件句式 (前件 + 後件) 表述﹔ 並且﹐如果我們接受前件﹔ 那麼﹐我們即被條件句式
Thumbnail
這篇文章將會介紹函式(Function)及其回傳值(retrun)的定義及介紹。
Thumbnail
這篇文章將會介紹函式(Function)及其回傳值(retrun)的定義及介紹。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News