點燈坊

失くすものさえない今が強くなるチャンスよ

ECMAScript 之 Static Variable

Sam Xiao's Avatar 2020-11-22

有時候我們希望 Function 執行完後,Variable 仍然有效,此稱為 Static Variable,ECMAScript 並沒有直接支援 Static Variable,但可使用 Function Property 或 Closure 實現。

Version

ECMAScript 2020

Function Property

let inc = () => {
  if (inc.count === undefined)
    inc.count = 0

  return inc.count++
}

inc() // ?
inc() // ?
inc() // ?

Function 為 Object,由於 ECMAScript 的 dynamic 特性,可針對 Object 動態新增 property,可藉此模擬 static variable。

static000

Nullish Coalescing Operator

let inc = () => {
  inc.count = inc.count ?? 0  
  return inc.count++
}

inc() // ?
inc() // ?
inc() // ?

可進一步使用 ?? 化簡。

Comma Operator

let inc = () => (inc.count = inc.count ?? 0, inc.count++)
  
inc() // ?
inc() // ?
inc() // ?

由於只有兩個動作,可再由 () 化簡成一行。

Closure

let _inc = () => {
  let count = 0
  return () => count++
}

let inc = _inc()

inc() // ?
inc() // ?
inc() // ?

Static variable 也可由 Closure 模擬,因此必須先建立 _inc() higher order function 建立 inc()

static001

IIFE

let inc = (count => () => count++)(0)

inc() // ?
inc() // ?
inc() // ?

對於 _inc() 這種只用一次的 higher order function,最適合使用 IIFE,且 count variable 剛好以 IIFE 的 argument 化簡。

static002

Conclusion

  • Static variable 可由 function property 或 closure 模擬
  • Higher order function、closure 與 IIFE 常一起搭配使用