下列代码很好的展示了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表现一致!
参考 :