zoukankan      html  css  js  c++  java
  • 闭包和递归

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

    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

  • 相关阅读:
    AutoCompleteTextView控件的使用
    menu菜单
    fragment之间的通信
    fragment的生命周期
    用模型取代字典的好处
    使用fragment兼容低版本的写法
    模拟微信主界面
    动态替换fragment
    fragment入门
    Spring MVC学习总结(1)——Spring MVC单元测试
  • 原文地址:https://www.cnblogs.com/hanshuai0921/p/6761908.html
Copyright © 2011-2022 走看看