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闭包

你可能感兴趣的:(JavaScript,python,F#,perl)