什么是“关闭”?

谁都会走 提交于 2020-02-26 04:52:20

我问了一个关于咖喱和封闭的问题。 什么是封包? 它与咖喱有何关系?


#1楼

简而言之,函数指针只是指向程序代码库中某个位置的指针(例如程序计数器)。 而Closure =函数指针+堆栈帧


#2楼

来自Lua.org

当一个函数用另一个函数括起来编写时,它可以完全访问该包围函数中的局部变量。 此功能称为词汇作用域。 尽管这听起来似乎很明显,但事实并非如此。 词法作用域以及一流的功能在编程语言中是一个强大的概念,但是很少有语言支持该概念。


#3楼

不包含自由变量的函数称为纯函数。

包含一个或多个自由变量的函数称为闭包。

var pure = function pure(x){
  return x 
  // only own environment is used
}

var foo = "bar"

var closure = function closure(){
  return foo 
  // foo is a free variable from the outer environment
}

src: https//leanpub.com/javascriptallongesix/read#leanpub-auto-if-functions-without-free-variables-are-pure-are-closures-impure


#4楼

如果您来自Java世界,则可以将闭包与类的成员函数进行比较。 看这个例子

var f=function(){
  var a=7;
  var g=function(){
    return a;
  }
  return g;
}

功能g是一个封闭: g关闭a在左右。 g可与一个成员函数进行比较, a可与一类字段,并且该函数进行比较f与类。


#5楼

我将举一个示例(使用JavaScript):

function makeCounter () {
  var count = 0;
  return function () {
    count += 1;
    return count;
  }
}

var x = makeCounter();

x(); returns 1

x(); returns 2

...etc...

该函数makeCounter的作用是返回一个函数,我们称其为x,每次调用该函数时,其计数将加一。 由于我们没有为x提供任何参数,因此必须以某种方式记住该计数。 它知道根据所谓的词法作用域在哪里找到它-它必须寻找定义它的地方才能找到该值。 此“隐藏”值称为闭包。

这又是我的例子:

function add (a) {
  return function (b) {
    return a + b;
  }
}

var add3 = add(3);

add3(4); returns 7

您会看到,当使用参数a(即3)调用add时,该值包含在我们定义为add3的返回函数的闭包中。 这样,当我们调用add3时,它知道在哪里可以找到一个值来执行加法。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!