在这段程序中,函数InsFunc是函数ExFunc的内嵌函数,而且是ExFunc函数的返回值。咱们注意到一个问题:内嵌函数InsFunc中 引用到外层函数中的局部变量sum,IronPython会这么处理这个问题呢?先让咱们来看看这段代码的运行结果。当咱们调用分别由不一样的参数调用 ExFunc函数获得的函数时(myFunc(),myAnotherFunc()),获得的结果是隔离的,也就是说每次调用ExFunc函数后都将生成并保存一个新的局部变量sum。其实这里ExFunc函数返回的就是闭包。
程序员
引用环境
按照命令式语言的规则,ExFunc函数只是返回了内嵌函数InsFunc的地址,在执行InsFunc函数时将会因为在其做用域内找不到sum变量而出 错。而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个总体(闭包)返回。如今给出引用环境的定义就 容易理解了:引用环境是指在程序执行中的某个点全部处于活跃状态的约束(一个变量的名字和其所表明的对象之间的联系)所组成的集合。闭包的使用和正常的函 数调用没有区别。编程
因为闭包把函数和运行时的引用环境打包成为一个新的总体,因此就解决了函数编程中的嵌套所引起的问题。如上述代码段中,当每次调用ExFunc函数 时都将返回一个新的闭包实例,这些实例之间是隔离的,分别包含调用时不一样的引用环境现场。不一样于函数,闭包在运行时能够有多个实例,不一样的引用环境和相同 的函数组合能够产生不一样的实例。
数组