在正常情况下,函数外部无法读取函数内的局部变量,但是可以在函数内部定义一个新的函数,再return这个函数来实现读取局部变量
在Javascript中,查找变量时会按照 “作用域链”的结构进行,即是会一级一级地向上寻找父函数的变量,也就是说,父函数的所有变量对子函数都是可见的,反子则不成立
根据上页代码运行结果输出的是”kevin”,执行f3相当于执行了f2函数,在f1内部形成了一个活动对象,在f1执行时,内部的name会覆盖外部的变量的值,所以name=“kevin”
F1执行完后会自动销毁,但内部的f2的引用给了f3,所以name的值没有销毁,销毁的是作用域链
<script type="text/javascript"> window.onload = function(){ var $li = document.getElementsByTagName("li"); /* for (i = 0; i < $li.length; i++) { $li[i].onclick = (function(n){ console.log($li[n].innerHTML); })(i) };*/ for (var i = 0; i < $li.length; i++) { $li[i].onclick = (function(n){ return function (){ console.log($li[n].innerHTML); }; })(i) }; } </script> </head> <body> <ul> <li>广州</li> <li>上海</li> <li>北京</li> <li>南京</li> </ul> </body>
闭包简单理解成“定义在一个函数内部的函数”,将函数内部和函数外部连接起来的一座桥梁。
原文:http://www.cnblogs.com/kevindon002/p/4949160.html