对闭包的简单了解

什么是闭包?通俗的说闭包是指能读取其他函数内部的函数。这句话又是什么意思呢?我们来看个例子

function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();

这段代码定义了一个函数a,在函数a的内部嵌套了另一个函数b,而这个函数a又返回函数b,在函数a的外部我们定义了一个变量c,这个变量c表面上指向的是函数a,但是根据函数a的结构可看出变量c实际上指向的是函数b。

这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程。
在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。

时间: 2024-11-06 07:52:57

对闭包的简单了解的相关文章

Swift学习--闭包的简单使用(三)

一.Swift中闭包的简单使用 override func viewDidLoad() { super.viewDidLoad() /** 闭包和OC中的Block非常相似 OC中的block类似于匿名函数 闭包是用来定义函数 作用:Block是用于保存一段点,在需要的时候执行 闭包也是用于保存一段点,在需要的时候执行做一个耗时操作 */ /** 闭包的基本格式: { (形参列表)->() in 需要执行的代码 } */ /** * 闭包的几种格式: 1.将闭包通过实参传递给函数 2.如果闭包是

闭包的简单实例和解释

var fff=(function(){ var a=1; function fn1(){ a++; console.log(a); }; function fn2(){ return a+10; }; return {f1:fn1, f2:fn2};})() var ss=fff.f1; var cc=console.log(fff.f2());//11 ss();//2 var fnbg=function(num){ var number=num; return function bg(nu

对闭包的简单理解

javascript理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部

闭包的简单定义和使用

<span style="font-size:18px;"> /* 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. * 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类似. * 闭包可以捕获和存储上下文中定义的的任何常量和变量的引用.这就是所谓的变量和变量的自封闭, * 因此命名为"闭包"("Closures)").Swift还会处理所有

闭包的简单理解

什么是闭包? 简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数. (父函数包裹子函数,这个子函数中存在能够访问父函数中变量的引用,这个子函数就是闭包) 为什么需要闭包? 局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染,在全局作用域中可以访问到被保存在局部作用域的变量. 特点 占用更多内存 不容易被释放 何时使用? 变量既想反复使用,又想避免全局污染 如何使用? 1.定义外层函数,封装被保

javascript闭包的简单理解

奖Javascript闭包前,先给大家讲个小故事 故事背景:刘备和曹操煮酒的时间段,故事可能有点小差异,刘备为曹操手下,关羽为间谍. 咳咳 曹操很想知道手下新来的刘备整天鼓捣啥: 曹操就问刘备,玄德你整天鼓捣啥: 刘备想,我靠这怎么能告诉你,劳资岂不是找死,打个马虎眼就过去了,曹操什么也没问出来: 刘备回到家里,跟关羽说,二弟,哼,曹操那个傻吊,哼! 关羽晚上也回到家里,跟老婆说,哼,大哥那个傻吊,哼!我这就去告诉丞相: 曹操也不能罢休,就去问关羽,关羽正要去告密,就一五一十  ¥%…@?%%:

SWIFT 闭包的简单使用二

import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window = UI

js 闭包的简单理解

let a = function(){ var i=0; let b = function(){ i++; alert(i); } return b; } let c = a(); c(); 这段代码有两个特点: 1.函数b嵌套在函数a内部: 2.函数a返回函数b.  这样在执行完var c=a()后,变量c实际上是指向了函数b 当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包. 闭包有什么作用? 闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源, 因为a

SWIFT 闭包的简单使用

import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window = UI