none
javascript 的问题 是否是一个bug? RRS feed

  • 问题

  • function reg(n,m)
    {
     return function(k)
     {
      return k+m+n*10;
     }
    }

    function print(str)
    {
     alert(str);

    ///WScript.Echo(str);
    }
    function new_object()

     var obj =
     {
      
      mn:reg(4,1),
      xy:reg(4,2),
      id:reg(4,3)
     };
     
     var object = {};

     for(var i in obj)
      object[i] = function(){return obj[i](object.__obj);}

     return function(val){object.__obj=val;return object;}
    }

     

    var __new_object__= new_object();

    var nn = __new_object__(100);


    print(nn.mn());
    print(nn.xy());
    print(nn.id());

     

    所有的值计算出来都是143 仿佛m和n没有起作用,但是在

    for(var i in obj)
    object[i] = function(){return obj[i](object.__obj);}

    期间结果是正确的

     


    • 已编辑 Jack Vinson 2011年12月2日 3:42 143结果错误
    2011年12月2日 3:38

全部回复

  • 你好,

    我debug了下你的代码,情况如下:

    按照你的代码逻辑出来的的确全是143,你也可以自己一步一步debug下。

    2011年12月5日 6:04
  • for(var i in obj)
    object[i] = function(){return obj[i](object.__obj);}

    return function(val){object.__obj=val;return object;}

    这里的i会一直保留id 这样

    for(var i in obj)
    object[i] = function(){return obj[i](object.__obj);}中 object[i]没有被在循环中解释 而是在最后 调用mn或者id方法的时候才被解释 而这个时候i就已经等于id了

     

    同样如果把代码改成

    for(var i in obj)

    {

    var f = obj[i];
      object[i] = function(){return f(object.__obj);}

    }结果也是143 而f会被一直保留在obj["id"]这个状态

    是我对闭包的理解错误? 还是其他什么深层次的原因

    function(){return f(object.__obj);} 貌似只有在用到时候才被解析了一样,而在赋值给object[i]时候 就复制了一个字符串?

    这个我在lua中的结果和预期的一样,都是分别调用了 mn id xy 而在js中都只有id被调用了


    2011年12月13日 9:25