JS定时器传参递归优化

371 阅读1分钟

原函数

let timer = null
function foo(obj) {
    window.clearTimeout(timer)
    // do sth.
    timer = window.setTimeout(function(){
        foo(obj)
    },100) //  每次执行形成匿名作用域,引用了当前作用域的变量,形成了闭包,当前作用域无法销毁
}

由于形成了闭包,首次执行foo函数是的作用域在后续递归中无法销毁父级作用域,导致嵌套作用域都不能被销毁

注意:以下情况不会发生,因为没有用到上级作用域的引用值

let timer = null
function foo(obj) {
    window.clearTimeout(timer)
    // do sth.
    timer = window.setTimeout(foo,100) //  每次执行形成匿名作用域,但是会销毁当前作用域
}

优化:

let timer = null
function foo(obj) {
    _foo()
    function _foo() {
        window.clearTimeout(timer)
        // do sth.
    }
    timer = window.setTimeout(_foo,100) //  每次执行形成匿名作用域,但是会销毁当前作用域
}