closures

作者: 币来币往 | 来源:发表于2018-04-05 17:54 被阅读0次

closures 是js的特色,它的本质即一个函数+这个函数生成的上下文环境。
我们以下面的代码为例来讲解closures

var count = 0;
function getCounter(){
    var count = 0;
    return function(){
      count++;
    };
}
var counter = getCounter();
var result = counter();

当我们调getCounter()时,返回的是什么呢?
答: 返回的是一个匿名函数。
那么该匿名函数返回后,我们调用它时,其中使用的count是全部变量中的count,还是getCounter中的局部变量count? 因为我们知道局部变量在函数执行完之后就会清空,所以在我们执行counter() 的时候,好像局部变量已经被清掉了,所以好像应该是全局的count, 对不对?
答: 不对。getCounter()返回的起始不止是一个匿名函数,该匿名函数在声明的时候,其中有个count变量,不是它的局部变量,也不是参数,我们称这种变量为free variable. 当返回的函数包含free variable的时候,我们会对该返回函数创建一个environment,来存储其用到的free varibale,这些freevariable,由于不是该函数创建的,我们就会去上一层找改变量,这里即去getCounter找,如果找到则使用,如果没找到,则去再上一层找,知道全部变量,如果仍然没找到则认为是undefined.
所以当调用getCounter() 的时候,其返还的是 匿名函数+ 改函数中free variable所在的environment.
这样,当我们执行该函数时,引用和修改的变量都是environment中的变量;

所以, closures = function + envrionment, 没什么神秘的!

相关文章

  • Swift工具包

    Closures[https://github.com/vhesener/Closures]为UIKit和Foun...

  • closures

    closures 是js的特色,它的本质即一个函数+这个函数生成的上下文环境。我们以下面的代码为例来讲解closu...

  • Closures

    广义上函数和内嵌函数都属于特殊的闭包 闭包的三种格式1-全局函数是有名字,但捕获值的闭包2-内嵌函数是有名字,可以...

  • closures

  • closures

    一个闭包例子,侵删

  • Closures

    Closure Expressions The Sorted Method the above example s...

  • Swift 2.1 Closure(闭包)

    # 闭包(closures) -/*闭包(Closures) - *闭包是自包含的功能代码块,可以在代码中使用或者...

  • <iOS 实践经验>判断循环引用的小技巧

    在 swift 中经常使用 Closures, 但有的时候使用 Closures 会造成一些不可避免的问题, 比如...

  • Swift闭包--简不简洁?!优不优雅?!

    闭包(Closures) 闭包是自包含的函数代码块,可以在代码中被传递和使用。 Closures are self...

  • Swift Closures随想

    本文不会对Closures的基本语法进行解读,如果对于Closures语法有所疑惑,请参考Apple官方文档本文主...

网友评论

      本文标题:closures

      本文链接:https://www.haomeiwen.com/subject/wsddhftx.html