1. 程式人生 > 遊戲 >人氣射擊系列新作《Aleste Branch》2022年初推出

人氣射擊系列新作《Aleste Branch》2022年初推出

閉包:

  • 閉包的概念:引用了另一個函式作用域中變數的函式,通常是在巢狀函式中實現的

    • 注:其實就是有一個函式a,它內部又定義了一個函式b,這個b引用了a中的變數,就產生了閉包
  • 閉包的作用:

    1. 延長了區域性變數的生命週期閉包不再使用時一定要記得釋放記憶體!!!切記!切記!
    2. 隱藏變數,避免全域性汙染
  • function fun() {
        // 閉包產生,函式fn宣告提升,引用了fun內的區域性變數a
        let a = 0
        function fn() {
            return a++
        }
        return fn
    }
    
    // f指向fn中存放的函式,在fun呼叫結束後,fn這個變數已經銷燬了(它只是存放的函式的地址值)
    let f = fun()
    console.log(f()); // 0
    console.log(f()); // 1
    console.log(f()); // 2
    // 閉包死亡(f不再指向該函式,所以這個函式物件變成了垃圾物件,會被回收)
    f = null
    
  • 面試題:

    • 第一題

      // 值得注意的是,這個並不是一個閉包,因為裡面的函式並沒有引用外部函式的變數
      var name = "The Window"
      var object = {
        name: "My Object",
        getNameFunc() {
          return function () {
            return this.name
          }
        }
      }
      /* 
       第一個()呼叫:
       object.getNameFunc() ==> 返回了內部的函式,下面用fn來代指這個函式
       第二個()呼叫:
       fn() 可以看出這個呼叫的this其實就是window了,所以打印出的是 The Window
      */
      console.log(object.getNameFunc()()) // The Window
      
      
    • 第二題

      var name = "The Window"
      var object = {
        name: "My Object",
        getNameFunc() {
          // 這個就比較簡單了,then儲存了當前函式的this,指向了object,這個then變數只要閉包存在就不會被回收,所以輸出是 My Object
          var then = this
          return function () {
            return then.name
          }
        }
      }
      
      console.log(object.getNameFunc()()); // My Object
      

附加小知識:

  1. 記憶體溢位:當程式執行需要的記憶體超過了剩餘的記憶體時,就會丟擲記憶體溢位的錯誤

  2. 記憶體洩漏:

    • 佔用的記憶體沒有及時釋放

    • 記憶體洩露積累多了就容易導致記憶體溢位

    • 常見的記憶體洩漏:

      • 意外全域性變數(沒有使用關鍵字宣告)
      • 沒有及時清理的計時器或回撥函式
      • 閉包