iT邦幫忙

第 11 屆 iThome 鐵人賽

1
自我挑戰組

JavaScript核心篇系列 第 19

【JavaScript 核心】閉包 #19

  • 分享至 

  • xImage
  •  

回想一下先前的函式記憶體釋放

// 這段程式碼為增加記憶體空間使用
  function randomString(length) {
    var result = '';
    var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var charactersLength = characters.length;
    for (var i = 0; i < length; i++) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
    }
    return result;
  }
// 注意: 我們將  demoData 放在全域做宣告
// 此時記憶體空間約為 32MB
  var demoData = [];
  function getData() {
    for(let i = 0; i < 1000; i++) {
      demoData.push(randomString(1000))
    }
  }
  getData();

若是放在函式內,記憶體空間約為 2MB
因為執行完函式後,demoData 沒有任何參照,所佔記憶體空間會被釋放掉

  function getData() {
    var demoData = [];
    for(let i = 0; i < 1000; i++) {
      demoData.push(randomString(1000))
    }
  }
  getData();

把 demoData 丟到 setTimeout 裡
記憶體空間一開始會是 32MB,10 秒後會變成 2MB

  • 這裡就是一個閉包的概念
  • 在子函式使用父函式宣告的的變數,就可避免父函式在沒有任何參照的情況下就直接被釋放掉
  function getData() {
    var demoData = [];
    for(let i = 0; i < 1000; i++) {
      demoData.push(randomString(1000))
    }
  }
  setTimeout(function() {
    demoData;
  }, 10000);
  getData();

範例:閉包

  function storeMoney() {
    var money = 1000;   // 因為範圍鍊的關係不會被釋放掉,給子函式做使用
    return function(price) {
      money = money + price;
      return money;
    }
  }
  
  console.log(storeMoney());  // 是一個表達式,會回傳一個值
  // 回傳 f(price){...} 這個函式
  
  console.log(storeMoney()());  // 再加一個 () 來執行後面的函式
  console.log(storeMoney()(100));  // 1100
  • 透過閉包執行屬於自己的函式
  • 各自擁有自己的變數 ( money )
// 小明的錢包
  var MingMoney = storeMoney();  // storeMoney() 為表達式
  console.log(MingMoney);  // f(price){...}
  console.log(MingMoney(100));  // 1100
  console.log(MingMoney(100));  // 1200
  console.log(MingMoney(100));  // 1300

// 杰倫的錢包
  var JayMoney = storeMoney();
  console.log(JayMoney(1000));  // 2000
  console.log(JayMoney(1000));  // 3000
  console.log(JayMoney(1000));  // 4000

上一篇
【JavaScript 核心】參數 #18
系列文
JavaScript核心篇19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿展展展
iT邦好手 1 級 ‧ 2020-03-13 06:24:24

啊!!! 可惜斷惹!!

我要留言

立即登入留言