什么是闭包(closure),为什么要用它?

Posted MrLQZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是闭包(closure),为什么要用它?相关的知识,希望对你有一定的参考价值。

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

闭包的特性

1.函数内再嵌套函数
2.内部函数可以引用外层的参数和变量
3.参数和变量不会被垃圾回收机制回收

 

html:

<!-- li节点的onclick事件都能正确的弹出当前被点击的li索引 -->
<
ul id="testUL">   <li> index = 0</li>   <li> index = 1</li>   <li> index = 2</li>   <li> index = 3</li> </ul>

JS:

<script type="text/javascript">
  var nodes = document.getElementsByTagName("li");
  for(i = 0;i<nodes.length;i+= 1){
    nodes[i].onclick = (function(i){
      return function() {
        console.log(i);
      } //不用闭包的话,值每次都是4
    })(i);
  }
</script>


然后我们看看下面的一段代码,这是对闭包作用的非常直白的描述:

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

执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在
使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源
因为say667()的内部函数的执行需要依赖say667()中的变量

 

以上是关于什么是闭包(closure),为什么要用它?的主要内容,如果未能解决你的问题,请参考以下文章

什么是闭包(closure),为什么要用它?

前端面试题js和jQuery

我所理解的JavaScript闭包

什么是外函数,什么是内函数?闭包(Closure)是什么?说说你对闭包(Closure)的理解?

closure

closure