zoukankan      html  css  js  c++  java
  • 函数闭包

    函数闭包

    1、什么是函数闭包

    所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

    2、函数闭包的作用

    ① 可以在全局作用域中访问局部变量

    ② 可以让局部变量一直驻留在计算机的内存中

    3、在全局作用域中访问局部变量

    例1:在全局作用域中无法访问局部变量

    以上程序无法直接运行,是错误的,主要受到两方面的影响:

    ① 作用域不允许

    ② 受到Javascript垃圾回收机制的影响,当display函数运行完毕后,其内部的局部变量和函数都会自动被内存所回收。

    4、Javascript垃圾回收机制(引用计数器)

    系统中的每块内存都有一个引用计数器,默认其值为0。当全局作用域中有变量对其引用时,其内置的引用计数器进行+1操作,当Javascript中的垃圾回收机制运行时,系统首先会判断当前内存的引用计数器是否为0,如果为0代表没有引用,则自动回收。

    5、使用函数闭包访问局部变量

    在Javascript中,可以把函数在内存中的首地址作为函数的返回值直接返回。

    例1:

    以上程序的运行结果:hello

     

    问题:为什么display函数运行完毕后,其内部的fn函数还没有被回收呢?

    答:正常情况下,display函数运行完毕后,其内部的变量和函数都会自动被Javascript中的垃圾回收机制所回收。但是上题中,由于在全局作用域中有一个test变量实现了对fn函数的首地址的引用,所以在内存中,fn函数在内存中的引用计数器要进行+1操作,当Javascript中的垃圾回收机制运行时,其并不会被回收,所以我们可以直接访问fn函数。

     

    例2:使用以上特性实现对局部变量的访问

    运行结果:10

    说明:由于受到test全局变量的影响,fn函数并不会被内存所回收,又由于fn函数引用了一个变量i,根据作用域链的原则,系统会自动到上一级作用域寻找var的声明语句,找到了var i = 10则直接使用,所以其也会导致局部变量i也不能被内存所回收,从而实现对局部变量的访问,我们把这个函数就称之为"闭包函数"。

    6、让局部变量一直驻留在计算机内存中

    说明:函数闭包一共有两个特性(① 访问局部变量 ② 让变量一直驻留在计算机内存中)

    当执行var test = display()完毕后,系统会将fn函数在内存中的首地址赋值给去全局变量test,又由于fn函数引用了局部变量i,所以会导致变量i也不能被内存所回收,当我们执行test(),系统会自动调用局部变量i然后进行++操作,所以第一次弹出结果为11,当第二次执行test()函数时,系统会自动调用fn函数,由于fn函数中执行alert(++i),又由于局部i一直没有被内存所回收,所以其值为11,进行++操作则变为12,然后直接输出,依次类推,第三次弹出13,第四次弹出14,所以由此可知:闭包会导致局部变量一直驻留在计算机内存中。

    7、练习题(提示:使用闭包解决)

  • 相关阅读:
    MVC,KVO,KVC的简单认识
    Objective-C之集合对象
    Objective-C之词典对象
    Objective-C之数组对象
    Objective-C关键字static
    IOS做天气预报
    同步和异步GET,POST请求
    iOS开发常用的开源库和示例
    KVC KVO KVB
    iOS中的 沙盒文件夹 (数据的写入和读取,归档和反归档)
  • 原文地址:https://www.cnblogs.com/nyxd/p/5364588.html
Copyright © 2011-2022 走看看