它既不是类也不是构造函数,在 JavaScript 中,任何函数都可以返回一个对象,如果函数前面没有使用 new 关键字,却又返回一个对象,那这个函数就是一个工厂函数。
// 写一个 foo 函数,这个函数返回首次调用时的时间
// 普通方法
let t
const foo = () => {
if (t) return t
t = Date.now()
return t
}
/**
* 问题:
* 1. 污染了全局变量
* 2. 每次调用 foo 的时候都需要进行一次判断
*/
// 闭包
const foo = (() => {
let t
return () => {
if (t) return t
t = Date.now()
return t
}
})()
/**
* 问题:
* 1. 每次调用 foo 的时候都需要进行一次判断
*/
// 函数对象
let foo = () => {
if (foo.t) return foo.t
foo.t = Date.now()
return foo.t
}
/**
* 问题:
* 1. 每次调用 foo 的时候都需要进行一次判断
*/
// 惰性函数
let foo = () => {
let t = Date.now()
foo = () => {
return t
}
return foo()
}