2019年4月18日 星期四

[Back To Basic] Javascript - Function Closures

閉包(Closures)


  • javascript 變數只有全域變數和區域變數二種
  • 閉包(closures)可以讓全域變數變成區域變數

function 和 變數的關係


  • function 可以使用所有在內部宣告的變數
  • function 也可以使用所有在外部宣告的全域變數
  • 不使用 var 宣告的變數,一律被視為全域變數,無論在 function 內或外

問題


  • 用全域變數記

var count = 0;
function myAdd1() {
    var count = 0;
    count += 1;
}

myAdd1();
myAdd1();
myAdd1();
var show = count1; // count 想要顯示 3, 但結果 count = 0, 因為這邊的 count 是全域變數

  • 用區域變數記

function myAdd2() {
    var count = 0;
    count += 1;
    return count;
}
var show = myAdd2(); // count 想要顯示 1,2,3..., 但結果 count = 1,1,1...

解決步驟

  • 1. 建立巢狀 function,額外形成,上下關係作用域
function myAdd3() {
    var count = 0;
    function plus() {
        count += 1;
    }
    plus();
    return count;
}
var myAdd4 = (function () {
    var count = 0;
    return function () {
        count += 1;
        return count;
    }
})()
myAdd4(); // count = 1
myAdd4(); // count = 2
myAdd4(); // count = 3

說明

宣告 var myAdd4 為立即函式時
  • count = 0 立刻執行,且只執行一次
  • myAdd4 被指定為 
function () {
    count += 1;
    return count;
}
  • 使用 myAdd4(),仍然可以變更 count 的值 <--- 這一連串的設計方式被稱為閉包
  • 也讓 count 成功地變成 private 變數
  • count 被 匿名函式的作用域(the scope of the anonymous function) 保護起來 <--- 目的達成
閉包特性: 閉包是一個,可以在父作用域(parent scope)被關閉時持續訪問(access)的 function


沒有留言:

張貼留言