iambic
V2EX  ›  问与答

请问 lua 里的闭包和 js 里的闭包处理结果怎么不一样?

  •  
  •   iambic · Nov 11, 2015 · 2496 views
    This topic created in 3910 days ago, the information mentioned may be changed or developed.
    function foo()                                                                                
        local rs = {}                                                                             
        for i=1,10 do                                                                             
            rs[i] = function() return i end                                                       
        end                                                                                       
        return rs                                                                                 
    end
    
    
    local fn = foo()                                                                              
    
    for i=1,#fn do
        print(fn[i]())
    end
    

    这段代码输出的结果是 1 2 3 ... 10

    而下面这边 js 代码

    function foo() {
        var rs = []; 
        for (var i=0; i <10; i++) {
            rs[i] = function() {
                return i;
            };  
        }   
        return rs; 
    }
    
    var fn = foo();
    
    for (var i = 0; i < fn.length; i++) {
        console.log(fn[i]());
    }
    

    输出的结果是 10 10 10 ... 10

    两者实现上似乎并无不一样啊?谢谢!

    2 replies    2015-11-11 16:45:17 +08:00
    lujjjh
        1
    lujjjh  
       Nov 11, 2015
    因为 javascript 中用 var 定义的变量的作用域不是块级的而是函数级的,所以两段代码不等价。

    var 换成 let 就一样了。
    iambic
        2
    iambic  
    OP
       Nov 11, 2015
    @lujjjh 原来是这样。。多谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   6037 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 124ms · UTC 03:20 · PVG 11:20 · LAX 20:20 · JFK 23:20
    ♥ Do have faith in what you're doing.