JS 中的惰性函数

776 阅读2分钟

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 对象实例,都是第一次调用获得的结果。