iteye_4865 2009-04-27 10:13
浏览 323
已采纳

Javascript闭包与python 闭包

下列代码很好的展示了JS函数的闭包

 

var f=[];
for(var i=0;i<10;i++)
f.push(function(){alert(i);});


f[0]();

打印 10.因为 所有f函数都共享同一个作用域window,调用时查找的是同一个window的i,即循环结束后的i

 

解决方法很多 ,其中之一是  i 复制到 函数最底层作用域中。

 

var f=[];
for(var i=0;i<10;i++)
f.push(function(i){return function(){alert(i);}}(i));


f[0]();

据某人说 : perl python 刚开始的表示就可以输出0 ,且有块作用域 ,我觉得 javascript 更合理啊,按照perl python 的做法 ,岂不是 定义函数时把函数里用到的外部变量 全部给自己做copy ???

 

不懂perl,python ,是真的这样么

 

 

参考 :

 

JavaScript对象模型-执行模型

  • 写回答

3条回答 默认 最新

  • phyeas 2009-04-27 10:13
    关注

    第一段代码直译过来应该是这样:
    [code="python"]
    f=[]
    for i in range(10):
    f.append(lambda:print(i))
    f0
    [/code]
    这样打印出来的值是i最后的值,(即9)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?