在正常情况下,函数外部无法读取函数内的局部变量,但是可以在函数内部定义一个新的函数,再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