闭包和递归

闭包是内部函数在其定义内部引用了内部变量,当一个函数执行完,内部变量又被新函数引用

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()//结果全部都是9,返回的函数又引用变量i;并没有立即执行,而是等到3个函数都返回时,引用的变量变化才能了3,返回都是9
function numberLog() {
    for (var i = 1;i <= 10;i++) {
        setTimeout(function () {
            console.log(i)
        }, 1000)
    }
}
numberLog();//代码的执行速度很快,我们循环了十次,生成了十个 setTimeout(function(){console.log(i)}, 1000) ,当一秒钟过去了,i早就变成11了,所以最后就会输出10个11

所以在闭包里返回的函数不要引用任何循环变量,或者后续会发生很大变化的变量

如果一定要引用循环变量,方法是创建一个函数,用函数的参数绑定当前循环变量的当前值,无论以后参数怎么变,已经绑定到函数的变量不再改变

def count():
    def f(j):              //创建一个函数绑定当前循环变量的值
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs
function numberLog() {
    for (var i = 1;i <= 10;i++) {
        (function (count) {
            setTimeout(function () {
                return console.log(count)
            }, 1000)
        })(i)
    }
}
numberLog();

这个会在控制台上会输出1-10

原文地址:https://www.cnblogs.com/hanshuai0921/p/6761908.html