java有闭包吗会造成内存泄漏吗

在 Node.js 中,广泛采用不同形式的闭包来支持 Node 的异步和事件驱动编程模型。通过很好地理解闭包,您可以确保所开发应用程序的功能正确性、稳定性和可伸缩性。
闭包是一种将数据与处理数据的代码相关联的自然方式,它使用&continuation passing(后继传递)作为主要的语义风格。使用闭包时,您在一个封闭范围内定义的数据源可供该范围内创建的函数访问,甚至在已经从逻辑上退出这个封闭范围时也是如此。在函数是一等 (first-class) 变量的语言中(比如 JavaScript),此行为非常重要,因为函数的生命周期决定了函数可以看到的数据元素的生命周期。在此环境中,很容易由于疏忽而在内存中保留比期望的多得多的数据,这样做很危险。
本教程将介绍在 Node 中使用闭包的 3 种主要用例:
完成处理函数
监听器函数
对于每种用例,我们都提供了示例代码,并指出了闭包的预期寿命和在寿命内保留的内存量。此信息可在设计 JavaScript 应用程序时帮助您深入了解这些用例如何影响内存使用,从而避免应用程序中的内存泄漏。
闭包和异步编程
如果您熟悉传统的顺序编程,那么在首次尝试了解异步模型时,您可能会问以下问题:
如果异步调用一个函数,您如何确保在调用时它后面(或周围)的代码可以处理该范围内的可用数据?或者换句话说,您如何实现依赖于异步调用的结果和副作用的剩余代码?
执行异步调用后,程序继续执行与异步调用无关的代码,您如何在异步调用完成后返回到最初的调用范围来继续运行?
闭包和回调可以回答这些问题。在最常见和最简单的用例中,异步方法采用了一个回调方法(具有一个关联的闭包)作为一个参数。此函数通常是在异步方法的调用位置上以内联方式进行定义的,而且该函数能访问围绕调用位置的范围的数据元素(局部变量和参数)。
举例而言,看看以下 JavaScript 代码:
function outer(a) {
var b= 20;
function inner(c) {
var d = 40;
return a * b / (d
var x = outer(10);
var y = x(30);
这是一个实时调试会话中的同一段代码的快照:
inner&函数在第 17 行调用(前面清单中的第 11 行)并在第 11 行上执行(该清单的第 5 行)。在第 16 行(清单中第 10 行),调用了&outer&函数 & 它返回&inner&函数。如屏幕截图所示,在第 17 行调用了&inner&函数并在第 11 行执行时,它能够访问它的局部变量(c&和&d)和outer&函数中定义的变量(a&和&b) & 尽管在第 16 行完成对&outer&函数的调用时已退出outer&函数的范围。
&要避免内存泄漏,了解回调方法何时和在多长时间内保持可访问性很重要。&
回调方法处于一个可调用它的状态(也就是说,从垃圾收集角度,可以访问它),所以它保持它能访问的所有数据元素处于活动状态。要避免内存泄漏,了解回调方法何时和在多长时间内保持该状态很重要。
总体上讲,闭包通常在至少 3 种用例中很有用。在所有这 3 种用例中,基本前提都是一样的:一小段可重用的代码(一个可调用的函数)能够处理并可选地保留一个上下文。
用例 1:完成处理函数
在完成处理函数模式中,将一个函数 (C1) 作为参数传递给某个方法 (M1),并在&M1&完成后调用C1&作为完成处理函数。作为该模式的一部分,M1&的实现可确保在不再需要&C1&后,它保留的对 C1 的引用会被清除。C1&常常需要调用&M1&的范围中的一个或多个数据元素。提供对此范围的访问能力的闭包在创建&C1&时定义。常见的一种方法是使用在调用&M1&的地方以内联方式定义的匿名方法。结果会得到一个&C1&闭包,它提供了访问可供&M1&使用的所有变量和参数的能力。
一个示例是&setTimeout()&方法。计时器过期后,调用完成函数 (completion function),并清除为计时器保留的完成函数 (C1) 引用:
function CustomObject() {
function run() {
var data = new CustomObject()
setTimeout(function() {
data.i = 10
完成函数使用来自调用&setTimeout&方法的上下文的&data&变量。甚至在&run()&方法完成后,为完成处理函数创建的闭包仍有可能引用&CustomObject,而不会对它进行垃圾收集。
闭包上下文是在定义完成函数 (C1) 时创建的,该上下文由可在创建&C1&的范围中访问的变量和参数组成。C1&闭包会保留到以下时刻:
完成方法被调用并完成运行,或者计时器被清除。
不会发生对&C1&的其他引用。(对于匿名函数,如果满足此列表中的前述条件,则不会发生任何其他引用。)
通过使用&,我们可以看到表示计时器的&Timeout&对象通过&_onTimeout&字段而拥有完成函数(传递给&setTimeout&的匿名方法)的引用:
尽管计时器已过期,但&Timeout&对象、_onTimeout 字段和闭包函数都通过对它们的一个引用而保留在堆中 & 在系统中挂起的超时事件。激活计时器且后续回调完成时,会删除事件循环中的挂起事件。所有 3 个对象都无法再访问,而且它们符合在后续垃圾收集周期中收集的条件。
清除计时器时(通过&clearTimeout&方法),会从&_onTimeout&字段中删除完成函数,而且,即使由于主函数保留了对&Timeout&对象的引用而保留了该对象,(只要不再发生对该函数的其他引用)该函数仍然可以在后续垃圾收集周期中收集。
在此屏幕截图中,将会对比触发计时器之前和之后获取的&:
#New 列显示了在转储之间添加的新对象,#Deleted 列显示了在转储之间收集的对象。突出显示的部分显示,CustomObject&存在于第一个转储中,但已被收集且未包含在第二个转储中,因此释放了 12 字节内存。
在此模式下,自然的执行流程使内存仅保留到完成处理函数 (C1) 将其 &完成& 该方法 (M1) 的工作处理完之时。结果是(只要及时完成应用程序调用的方法)您不需要特别注意避免内存泄漏。
设计实现此模式的函数时,请确保在触发回调时清除了对回调函数的所有引用。这样,即可确保满足使用您的函数的应用程序的内存保留预期。
用例 2:中间函数
在某些情况下,您需要能够以更加反复、迭代式和出乎意料的方式处理数据,无论数据是以异步创建还是同步方式创建的。对于这些情况,您可返回一个中间函数,可调用该函数一次或多次来访问所需的数据或完成所需的计算。与完成处理函数一样,您在定义函数时创建闭包,闭包提供了访问定义该函数的范围中包含的所有变量和参数的能力。
此模式的一个例子是数据流处理,其中服务器返回一大块数据,每收到一个数据块,就会调用客户端的数据接收器回调。因为数据流是异步的,所以操作(比如数据积累)必须是迭代式的,并以一种出乎意料的方式执行。下面的程序演示了此场景:
function readData() {
var buf = new Buffer(1024 * 1024 * 100)
var index = 0
buf.fill('g')
//simulates real read
return function() {
if (index & buf.length) {
return buf[index-1]
var data = readData()
var next = data()
while (next !== '') {
// process data()
next = data()
在这种情况下,只要&data&变量仍在范围中,就会保留&buf。buf&缓冲区的大小会导致保留大量内存,即使这对应用程序开发者而言不那么明显。我们可以使用 Chrome 开发者工具查看此效果,如在完成&while&循环后获得的快照所示:保留了更大的缓冲区,尽管不再使用它。
甚至在应用程序完成中间函数后,对该函数的引用仍会让关联闭包保持活动状态。要让该数据变得可以收集,应用程序必须重写此引用 & 例如按下列方式设置对中间函数的引用:
// Manual cleanup
data = null;
此代码允许对闭包上下文进行垃圾收集。下面这个来自堆转储的屏幕截图(在将&data&设置为null&后获取)表明可以通过手动废弃对保留的数据执行垃圾收集:
突出显示的行表明,缓冲区已被收集,它的关联内存已被释放。
通常,可以构造中间函数来限制潜在的内存泄漏。例如,一个允许增量读取大数据集的中间函数,可以删除对返回的数据部分的引用。但在这些情况下,一定要注意此方法不得给应用程序中采用非中间函数方式访问该数据的其他部分带来问题。
创建实现中间模式的 API 时,请小心地记录下内存保留特征,以便用户了解确保所有引用都被废弃的需求。更好的方法是,尽可能实现您的 API,使保留的数据可在中间函数中不再需要它时被释放。
例如,本节中的前一个示例中的函数可重写为:
return function() {
if (index & buf.length) {
return buf[index-1]
buf = null
此版本可确保在不再需要大型缓冲区时,可以收集它们。
用例 3:监听器函数
一种常见模式是注册函数来监听特定事件的发生情况。但问题是,监听器函数的生命周期通常是无限期的,或者不为应用程序所知。因此,监听器函数最可能导致内存泄漏。
&监听器函数最可能导致内存泄漏。&
&大多数流处理/缓冲方案都使用该机制来缓存或积累一个外部方法中定义的瞬时数据,而在一个匿名闭包函数中进行访问。您无法控制安装的监听器的生命周期或对其一无所知时,就会出现风险,如下面的示例所示:
var EventEmitter = require('events').EventEmitter
var ev = new EventEmitter()
function run() {
var buf = new Buffer(1024 * 1024 * 100)
var index = 0
buf.fill('g')
ev.on('readNext', function() {
var ret = buf[index]
return ret
下面的屏幕截图(在调用&run()&方法后获取)展示了如何为大型缓冲区&buf&保留内存。通过支配树可以看到,这个大型缓冲区由于与该事件的关联而保持活动:
回调函数(监听器)保留的数据会在撤销注册处理函数之前一直保持活动状态 & 甚至在读取了所有数据后仍会保持活动状态。在某些情况下,对监听器的各次回调之间可能不再需要数据。如果可能,通常最好根据需要分配数据,而不是在各次调用之间保留它。
在其他情况下,您无法避免在监听器的各次调用之间保留数据。解决方案是确保 API 提供了一种途径来在不再需要回调时撤销注册它们。这是一个示例:&
// Because our closure is anonymous, we can't remove the listener by name,
// so we clean all listeners.
ev.removeAllListeners()
此用例的一个著名的例子是一种典型的 HTTP 服务器实现:
var http = require('http');
function runServer() {
/* data local to runServer, but also accessible to
* the closure context retained for the anonymous
* callback function by virtue of the lexical scope
* in the outer enclosure.
var buf = new Buffer(1024 * 1024 * 100);
buf.fill('g');
http.createServer(function (req, res) {
res.end(buf);
}).listen(8080);
runServer();
尽管此示例展示了一种使用内部函数的便捷方式,但请注意,只要服务器对象处于活动状态,回调函数(和缓冲区对象)就都是活动的。只在服务器关闭后,该对象才符合收集条件。在下面的屏幕截图中可以看到,由于服务器请求监听器使用了缓冲区,所以该缓冲区将保持活动状态:
由此得出的教训是,对于任何保留大量数据的监听器,都需要理解并记录监听器的必要寿命,确保在不再需要监听器时注销它。另一种明智的方法是,确保监听器在各次调用之间保留最少量的数据,因为它们通常具有很长的寿命。
闭包是一种强大的编程结构,能够以更加灵活的、出乎意料的方式在代码和数据之间实现绑定。但是,习惯于 Java 或 C++ 等旧式语言的程序员可能不熟悉它的范围语义。为了避免内存泄漏,一定要理解闭包的特征和它们的生命周期。
&转自:/developerworks/cn/web/wa-use-javascript-closures-efficiently/index.html
&/blog/2014/10/event-loop.html
阅读(...) 评论()当前位置:
& Swift - 内存泄露原因(循环强引用)及解决办法
Swift - 内存泄露原因(循环强引用)及解决办法
发布:hangge
阅读:3640
Swift使用自动引用计数(ARC)来管理应用程序的内存使用。在大多是情况下,并不需要考虑内存的管理。当实例不再需要的时候,ARC会自动释放这些实例所使用的内存。
但ARC并不是绝对安全的。下面两种情况会发生内存泄露。
1,类实例之间的循环强引用
两个类实例都有一个强引用指向对方,这样的情况就是强引用循环,从而导致内存泄露。
class Teacher {
var tName : String
var student : Student?
init(name:String){
tName = name
println("老师\(tName)实例初始化完成")
println("老师\(tName)实例反初始化完成")
class Student {
var sName : String
var teacher : Teacher?
init(name:String){
sName = name
println("学生\(sName)实例初始化完成")
println("学生\(sName)实例反初始化完成")
//测试开始
var teacher:Teacher?
var student:Student?
teacher = Teacher(name: "李老师")
student = Student(name: "刘同学")
teacher!.student = student
student!.teacher = teacher
teacher = nil
student = nil
//测试结果(deinit未调用,则内存泄露)
老师李老师实例初始化完成
学生刘同学实例初始化完成
解决办法:使用弱引用
只需要将上述例子Teacher类的student变量加上关键字weak,或者将Student类的teacher变量加上关键字weak。
当A类中包含有B类的弱引用的实例,同时,B类中存在A的强引用实例时,如果A释放,也不会影响B的释放。但A的内存回收要等到B的实例释放后才可以回收。
class Teacher {
var tName : String
weak var student : Student?
init(name:String){
tName = name
println("老师\(tName)实例初始化完成")
println("老师\(tName)实例反初始化完成")
class Student {
var sName : String
var teacher : Teacher?
init(name:String){
sName = name
println("学生\(sName)实例初始化完成")
println("学生\(sName)实例反初始化完成")
2,闭包引起的循环强引用&
将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了实例,也会发生强引用循环。
class JsonElement{
let name:String
let jValue:String?
lazy var asJson:() -& String = {
if let text = self.jValue {
return "\(self.name):\(text)"
return "text is nil"
init(name:String, text:String){
self.name = name
self.jValue = text
println("初始化闭包")
println("闭包释放")
//开始测试
var p:JsonElement? = JsonElement(name: "p", text: "")
println(p!.asJson())
//测试结果(deinit未调用,则内存泄露)
初始化闭包
解决办法:使用闭包捕获列表
当闭包和实例之间总是引用对方并且同时释放时,定义闭包捕获列表为无主引用。但捕获引用可能为nil时,定义捕获列表为弱引用。弱引用通常是可选类型,并且在实例释放后被设置为nil。
class JsonElement{
let name:String
let jValue:String?
lazy var asJson:() -& String = {
[unowned self] in //使用无主引用来解决强引用循环
if let text = self.jValue {
return "\(self.name):\(text)"
return "text is nil"
init(name:String, text:String){
self.name = name
self.jValue = text
println("初始化闭包")
println("闭包释放")JavaScript使用一种称为垃圾收集的技术来管理分配给它的内存。这与C这样的底层语言不同,C要求使用多少借多少,用完再释放回去。其他语言,比如 Objective-C,实现了一个引用计数系统来辅助完成这些工作,我们能够了解到有多少个程序块使用了一个特定的内存段,因而可以在不需要时清除这些内存段。
A ---------& B ------------& C
例如对象A有一个属性指向B,而B也有一个属性指向C。即使当前作用域中只有对象A有效,但由于指针的关系所有3个对象都必须保留在内存中。当离开A的当前作用域时(例如代码执行到声明A的函数的末尾处),垃圾收集器就可以释放A占用的内存。此时,由于没有什么指向B,因此B可以释放,最后,C也可以释放。
然而,当对象间的引用关系变得复杂时,处理起来也会更加困难。
A ———& B ————& C
^、_ _ _ _ _ _ _ _|
这里,我们又为对象C添加了一个引用B的属性。在这种情况下,当A释放时,仍然有来自C的指针指向B。这种引用循环需要由JavaScript进行特殊的处理,但必须考虑到整个循环与作用域中的其他变量已经处于隔离状态。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:466次
排名:千里之外
(2)(3)(1)(3)js闭包函数为什么有内存泄漏的问题存在
js闭包函数为什么有内存泄漏的问题存在
能导致内存泄漏的一定是引用类型的变量,比如函数和其他自定义对象。而值类型的变量是不存在内存泄漏的,比如字符串、数字、布尔值等。
因为值类型是靠复制来传递的,而引用类型是靠类似c语言中的指针来传递的。
可以认为一个引用类型的变量就是一个指向某个具体的内存地址的指针。
当我们用js代码创建一个引用类型的时候(以下简称对象),js引擎会在内存中开辟一块空间来存放数据,并把指针引用交给那个变量。内存是有限的,js引擎必须保证当开辟的对象没用的时候,把所分配的内存空间释放出来,这个过程叫做垃圾回收,负责回收的叫做垃圾回收器(GC)。
内存泄漏是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。导致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。
不可控的东西才是最可怕的!最经典的例子就是外部我们不可控的引用。比如说IE6中dom对象引用了js对象,而dom对象在某个时刻被移除掉了,但js引擎不知道它被移除掉,还傻傻的保留着引用呢,就不会把js对象释放。然后就是闭包中的引用了。咱们使用闭包的目的,就是要保存内部变量的状态以便我们哪个时候去通过闭包使用它作用域内的变量。
我们可以把闭包形象的理解为一道门,屋子里面是内部变量。钥匙是一个引用。
当我们把钥匙给张三这个对象(otherObject1.p1 -& 门),产生了一个引用
当我们再配一把钥匙给李四这个对象(otherObject2.p2 -& 门)产生了另外一个引用
GC在回收的时候会判断一个闭包还有没有人拿着钥匙,要是没有引用或者是内部循环引用(李四在屋子里),就会释放闭包内变量所在的空间,回收垃圾
我斗胆的说一句:严格意义上讲,闭包不是真正产生内存泄漏的原因!各位有意见可以评论里指出,现在举个最简单的例子:
function bindEvent()
var obj = document.createElement(&XXX&);
obj.onclick = function(){
bindEvent();
这人把钥匙(引用)给了一个外部不可控的dom对象,怎么能怪人家闭包的错误呢!
再看下面代码:
var otherJsObj = {};
function bind()
otherJsObj.func1 = function(){
我把钥匙给了otherJsObj。然后叮嘱它:“你不用的时候就把你的func1置空或者赋值成别的对象,解除我的引用,我好回收垃圾”。这样可控,因为咱们都是自己人(js对象),有访问权限[呵呵]
闭包确实是在保持对别的对象的引用。也会产生较大的内存占用。但这是可控制的,不是闭包的错。
我的热门文章
即使是一小步也想与你分享主题 : 【__swift实战__】闭包中的内存泄漏陷阱
级别: 新手上路
可可豆: 375 CB
威望: 365 点
在线时间: 278(时)
发自: Web Page
来源于&&分类
【__swift实战__】闭包中的内存泄漏陷阱&&&
闭包就跟Block在OB中带给我们的强大一样,闭包是我们的强大的武器,具体的概念与使用请参考文档:闭包(Closures) 我们这里只来讨论一下在闭包使用过程中可能会遇到的一个隐秘的大问题:Memory leaks ! 首先我们来回顾一下我们在Object-C中使用Block的时候有没有遇到相同的问题? 我们用最常用的例子来说明,在一个子VC中进行操作以触发父VC中得到相应的响应操作:
级别: 新手上路
可可豆: 88 CB
威望: 78 点
在线时间: 0(时)
发自: Web Page
/p/t/203/p/t/358/p/t/377/p/t/296/p/t/756/p/t/248/p/t/993/p/t/791/p/t/366/p/t/094/p/t/184/p/t/341/p/t/055/p/t/251/p/t/304/p/t/179/p/t/176/p/t/102/p/t/495/p/t/152/p/t/973/p/t/032/p/t/106/p/t/783/p/t/911/p/t/866/p/t/218/p/t/093/p/t/006/p/t/067/p/t/685/p/t/399/p/t/879/p/t/471/p/t/643/p/t/367/p/t/995/p/t/764/p/t/835/p/t/408/p/t/177/p/t/827/p/t/158/p/t/127/p/t/243/p/t/049/p/t/844/p/t/027/p/t/075/p/t/976/p/t/237/p/t/536/p/t/265/p/t/659/p/t/653/p/t/539/fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train//fyfyfyff/train/
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版}

我要回帖

更多关于 自执行函数是闭包吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信