关于闭包的详解,以及为什么要用它
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以冲破作用域链,将函数内部的变量和方法传递到外部。
闭包的特性:
1、函数内再嵌套函数
2、内部函数可以引用外层的参数和变量
3、参数和变量不会被垃圾回收机制回收
例如://li节点的onclick事件能正确的弹出当前被点击的li索引
<ul id="testUL">
<li> index = 0</li>
<li> index = 1</li>
<li> index = 2</li>
<li> index = 3</li>
</ul>
<script type="text/javascript">
var list = document.getElementsByName("li")
for (var i = 0 ; i < list.length ; i++){//遍历每个li
//给每个li设置点击事件
list[i].onclick=(function ( i ){
return function(){
alert(i)
}//如果不用闭包的话,每次点击弹出的值都是4
})(li);
}
</script>
执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在使得JavaScript的回收机制GC不会回收say667()所占用的资源,是因为say667()的内部函数的执行需要依赖say667()中的变量。这是对闭包作用的非常直白的描述
function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() {
alert(num);
}
num++;
return sayAlert;
}
var sayAlert = say667();
sayAlert()//执行结果应该弹出的667