标签:
闭包:有权访问另一个函数作用域中的变量的函数
闭包作用:读取函数内部变量;保护变量不被销毁
例子1
函数可以读取全局变量
<script style="text/javascript"> var n=999; function f1(){ alert(n) } f1() //999 </script>
在函数外部无法读取函数内部的局部变量
<script style="text/javascript"> function f1(){ var n=999; } alert(n) //error </script>
在函数内部再创建一个函数,可以访问内部变量
<script style="text/javascript"> function f1(){ var n=999; function f2(){ alert(n); //999 } </script>
把f2作为返回值,就可以在f1外部访问f1内部变量
<script style="javascript"> function f1(){ var n=999; function f2(0{ alert(n); } return f2; } var result=f1(); result(); //999 </script>
例子2
作用域链的这种配置机智引出的一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值
<html> <head> <script style=text/javascript> for(var i=0;i<10;i++){ setTimeout(function(){ console.log(i); 结果:10 }) </script> <script style=text/javascript>
for(i=0;i<10;i++){ (function(a){ setTimeout(function(){ console.log(a); 结果:0,1,2,3,4,5,6,7,8,9 },1000) })(i);
} </script> </head> </html>
之所以会这样,是因为 setTimeout 中的 i 是对外层 i 的引用。当 setTimeout 的代码被解释的时候,运行时只是记录了 i 的引用,而不是值。而当 setTimeout 被触发时, setTimeout 中的 i 同时被取值,由于它们都指向了外层的同一个 i,而那个 i 的值在迭代完成时为 10,所以打印了五次 `10`。
为了得到我们预想的结果,我们可以把 i 赋值成一个局部的变量,从而摆脱外层迭代的影响。
标签:
原文地址:http://www.cnblogs.com/LittleGirl-mm/p/5584106.html