Javascript闭包与python 闭包

下列代码很好的展示了javscript函数的闭包,javascript没有块作用域,只有函数作用域

 

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));
//或者 更直接,手动copy i 到 自己的作用域
//f.push(function(){var t=i;return function(){alert(t);}}());
f[0]();

 

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


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

 

PS:后记:

 

python 没有块作用域,只有模块,类,函数作用域,上述javascript的等价python代码:

 

fs=[]
i=0
while i<10:
   
    def t():
        print i,"!"
    fs.append(t)
    i=i+1
    
fs[0]()

#作用域相关证明
print t
print fs[0]
print fs[9]
 

输出10,和javascipt表现一致!

 

参考 :

 

JavaScript对象模型-执行模型

 

python闭包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值