我问了一个关于咖喱和封闭的问题。 什么是封包? 它与咖喱有何关系?
#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时,它知道在哪里可以找到一个值来执行加法。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3163905