什么是闭包(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()中的变量

时间: 2024-10-21 17:05:09

什么是闭包(closure),为什么要用它?的相关文章

javascript 闭包(closure)

<script type="text/javascript">    //闭包(closure):内层函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经结束    //注意内层函数引用的外层函数内的变量是外层函数执行结束后的最终值    test(1);    function test(a) { //外层函数        alert(a+' 外层函数开始执行');        setTimeout(function(){//内层函数           

Swift语言精要-闭包(Closure)

闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. 那么,什么是闭包呢? 让我们看下在Javascript中闭包的解释: Closures are functions that have access to variables from another function’s scope. (This is often accomplished by

Swift中使用typealias定义一个闭包closure

在OC中我们定义一个Blocks是这样定义的: typedef void (^ZWProgressHUDCompletionBlock)(); 在Swift中定义一个闭包是这样的: typealias ZWProgressHUDCompletionBlock=()->Void 转载请注明!!!欢迎大家加入交流群:爱疯.爱Coding:209476515 Swift中使用typealias定义一个闭包closure,布布扣,bubuko.com

深入理解JavaScript闭包(closure)

最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目. 一.什么是闭包? “官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话通俗的来说就是:JavaScript中所有的function都是一个

闭包(closure)与协程共用时要注意的事情

闭包是一种可以让你用非常舒服的方式来编程的小技巧,Go也支持闭包.如果从来没有接触过闭包,想在一开始就弄懂什么是闭包(closure)是非常困难的,就像递归一样,直到你真正写过.用过它,你才能真正的对它有一个更具体的认识. 闭包就是一个函数,这个函数包含了运行它所需的上下文环境,这个环境可能是几个变量或者也会是其他的(通常就是变量).说闭包是一个函数不正确,更确切地说,闭包是一个打包了其作用域外部的上下文环境的一段运行环境.如果一时间没有理解这段闭包的含义也不要紧,这是一个循序渐进的过程. 那么

php中的匿名函数和闭包(closure)

一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函数的参数值.(http://php.net/manual/zh/functions.anonymous.php) 匿名函数的定义: $closureFunc = function(){ .... }; eg: 把匿名函数赋值给变量,通过变量来调用 $closureFunc = function($s

Python闭包Closure

Python的闭包和Python的内部函数 1 Python内部函数 def out(x): def inner(y): return "inner use % s" % y return inner(x) print out("jeapedu") 在out里定义了一个inner函数,out的返回值是调用inner(x)的值 2 python的闭包Closure def closure(x): def inner(y): return "closure u

[转] Java内部类之闭包(closure)与回调(callback)

闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用城内,内部类有权操作所有的成员,包括private 成员. Java最引人争议的问题之一就是,人们认为Java应该包含某种类似指针的机制,以允许回调(callback).通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象. 稍后将会看到

javascript_function(闭包Closure)

javascript闭包(Closure) 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 上面是官方的解释,但这解释只会让人头晕.要理解闭包,首先理解两点:变量的作用域以及作用域链,这两个在前面都已经介绍过了,并且举了简单了列子,来回顾一下: var color = "blue"; function changeColor(){ var anotherColor = "red"; funct

闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别

闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别 函数最常见的形式是具名函数(named function): function foo(){ console.log("named function") } foo() 不过也可以将函数视作数据赋值给变量,这样的函数可以没有名字: nameless = function(){ console.log("anonymouse function") } nameless(