如何向某人解释JavaScript关闭,知道它们所构成的概念(例如功能、变量等),但不了解关闭本身?
我已经在维基百科上看到了图表的例子,但不幸的是,它没有帮助。
如何向某人解释JavaScript关闭,知道它们所构成的概念(例如功能、变量等),但不了解关闭本身?
我已经在维基百科上看到了图表的例子,但不幸的是,它没有帮助。
当前回答
一个基本例子在JavaScript中的关闭:
关闭存储对外部函数的变量的参考:
它们不会存储实际值 关闭会变得更有趣,当关闭之前外部函数的变量变量的值被召唤时,并且这种强大的特性可以以创造性的方式利用,例如杜格拉斯·克罗克福德首次展示的这种私人变量例子:
函数名人ID( ) { var celebrityID = 999; // 我们将返回一个具有某些内部函数的对象 // 所有内部函数都有访问外部函数的变量返回 { getID:函数() { // 此内部函数将返回更新名人ID变量 // 它将返回名人ID的当前值,即使在
3、关闭已被告知
http://javascript.info/tutorial/closures http://www.javascriptkit.com/javatutors/closures.shtml
其他回答
我知道已经有很多解决方案,但我猜这个小而简单的脚本可以有用来证明这个概念:
// makeSequencer will return a "sequencer" function
var makeSequencer = function() {
var _count = 0; // not accessible outside this function
var sequencer = function () {
return _count++;
}
return sequencer;
}
var fnext = makeSequencer();
var v0 = fnext(); // v0 = 0;
var v1 = fnext(); // v1 = 1;
var vz = fnext._count // vz = undefined
没有自由变量的功能被称为纯功能。
包含一个或多个自由变量的功能被称为关闭。
var pure = function pure(x){
return x
// only own environment is used
}
var foo = "bar"
var closure = function closure(){
return foo
// foo is free variable from the outer environment
}
src: https://leanpub.com/javascriptallongesix/read#leanpub-auto-if-functions-without-free-variables-are-pure-are-closures-impure
我认为值得回头迈出一步,并考虑一个更普遍的“关闭”概念 - 所谓的“加入运营商”。
在数学中,“加入”操作员是部分命令集中的一个函数,返回最小的对象,大于或等于其论点。在符号中,加入 [a,b] = d 如 d >= a 和 d >= b,但没有一个 e 如 d > e >= a 或 d > e >= b。
因此,加入给你最小的东西“大”比部分。
现在,请注意,JavaScript Scopes 是一个部分安排的结构,所以有一个敏感的概念加入,特别是,一个加入 Scopes 的最小范围比原始 Scopes 大。
因此,对变量A、B、C的关闭是最小的范围(在您的程序的细节中!)将A、B、C带入范围。
关闭仅仅是当一个函数进入其外部范围后,即使该范围的函数完成执行。
function multiplier(n) {
function multiply(x) {
return n*x;
}
return mutliply;
}
var 10xmultiplier = multiplier(10);
var x = 10xmultiplier(5); // x= 50
我们可以看到,即使复合器完成执行后,内部函数复合器仍然可以访问这个例子中的 x 的值,即 10。
一个非常常见的使用关闭是流动(上面的同样的例子),在那里我们逐步用参数来完善我们的功能,而不是同时提供所有论点。
我们可以实现这一点,因为JavaScript(除了原型OOP之外)允许以功能的方式编程,在那里更高的命令功能可以采取其他功能作为论点(分类功能)。
我强烈建议你阅读这本书由Kyle Simpson: 2 一部分的书系列是专门关闭,它被称为范围和关闭。
皮诺基奥:1883年关闭(JavaScript前一世纪)
我想这最好可以解释给一个有趣的冒险的6岁男孩......Pinocchio的冒险的一部分,在那里Pinocchio被一个过度的狗鱼吞下。
var tellStoryOfPinocchio = 函数(原始) { // 准备令人兴奋的事情发生 var pinocchioFindsMisterGeppetto; var happyEnding; // 故事开始在那里Pinocchio寻找他的“父亲” var pinocchio = { 名称:‘Pinocchio’,位置:‘在海里’,鼻子长度: 2 }; // 它是一只狗......它是一只鱼...... // 狗鱼出现,但是我