JS中的惰性函数
导语
所谓惰性就是懒惰,惰性函数顾名思义可以理解为懒惰的函数,他的懒惰之处在于它仅仅执行一次他要做的事。所以个人理解,所谓惰性函数就是仅仅执行一次结果,之后再次执行的时候会返回第一次执行的结果。下面我们将讨论如何实现惰性函数。
从结果看惰性
1. 简单的惰性函数
示例代码:
var time = null
function getTime() {
if (!time) {
time = new Date().getTime()
}
return time
}
console.log(getTime())
setTimeout(() => {
console.log(getTime())
}, 1000);
执行结果:
1646151742616
1646151742616
可以看到两次执行的结果都是一样的, 说明变量time
仅仅被赋值过一次。第二次调用时虽然间隔了一秒,但还是返回第一次执行的时间。
2. 去除全局变量
但是上述代码还存在一个问题,就是 time
这个变量声明在了全局,这往往不是我们想要的结果,所以为了避免这样,我们可以利用立即执行函数将变量私有化。
const getTime = (
function () {
let time = null
if (!time) {
time = new Date().getTime()
}
return time
}
)()
console.log(getTime)
setTimeout(() => {
console.log(getTime)
}, 1000);
3. 改变原函数,去除 if
在第一次调用函数过后,我们还要进行 if 判断,那么能否去掉这个判断,直接给出结果呢?
function getTime() {
let time = new Date().getTime()
getTime = () => {
return time
}
return getTime()
}
console.log(getTime())
setTimeout(() => {
console.log(getTime())
}, 1000);
在 getTime()
方法中我们重写了 getTime
函数,使得 getTime
函数返回了第一次计算的值,那么这就好解释和理解我们开始说的惰性函数的定义了。
惰性函数的应用: 单例
function Person(name) {
this.name = name
}
function sharedPerson(name) {
let person = new Person(name)
sharedPerson = () => {
return person
}
return sharedPerson()
}
const p1 = sharedPerson('ouda')
const p2 = sharedPerson('oulanglang')
console.log(p1)
console.log(p2)
console.log(p1 === p2)
执行结果:
Person { name: 'ouda' }
Person { name: 'ouda' }
true
从结果看,尽管调用函数的参数不一样,但是利用惰性函数得到了两个相同的 Person 对象实例,都是第一次调用获得的结果。