如何向某人解释JavaScript关闭,知道它们所构成的概念(例如功能、变量等),但不了解关闭本身?
我已经在维基百科上看到了图表的例子,但不幸的是,它没有帮助。
如何向某人解释JavaScript关闭,知道它们所构成的概念(例如功能、变量等),但不了解关闭本身?
我已经在维基百科上看到了图表的例子,但不幸的是,它没有帮助。
当前回答
函数和函数的外部范围(语法环境)的参考
函数 汽车(制造商,模型,年,颜色) { 返回 { 到String() { 返回 `${ 制造商} ${ 模型} (${ 年}, ${ 颜色})` } } 组车 = 新车(‘Aston Martin’,‘V8 Vantage’,‘2012’,‘Quantum Silver’) console.log(car.toString())
事件导向的编程
在下面的例子中,所有实施细节都隐藏在即时执行的函数表达式内。 函数标记和 toString 接近私人状态和函数他们需要完成工作。 关闭已使我们能够模块化和包容我们的代码。
例子1
这个例子表明,本地变量在关闭中没有复制:关闭保持了对原始变量的参考。
左边
其他回答
关闭是函数被关闭时,函数被定义为名称空间,函数被召唤时是不可变的。
在JavaScript中,它发生时:
定义一个函数在另一个函数内 内部函数在外部函数返回后被召回
// 'name' is resolved in the namespace created for one invocation of bindMessage
// the processor cannot enter this namespace by the time displayMessage is called
function bindMessage(name, div) {
function displayMessage() {
alert('This is ' + name);
}
$(div).click(displayMessage);
}
关闭是函数内部的一个函数,它可以访问其“亲属”函数的变量和参数。
例子:
function showPostCard(Sender, Receiver) {
var PostCardMessage = " Happy Spring!!! Love, ";
function PreparePostCard() {
return "Dear " + Receiver + PostCardMessage + Sender;
}
return PreparePostCard();
}
showPostCard("Granny", "Olivia");
MDN 解释我认为最好的:
关闭是指独立(自由)变量的函数,换句话说,关闭中定义的函数“记得”它创造的环境。
关闭总是有一个外部功能和一个内部功能. 内部功能是所有工作发生的地方,而外部功能只是保留内部功能创建的范围的环境。 这样,关闭的内部功能“记得”它创建的环境/范围。
var closure = function() {
var count = 0;
return function() {
count++;
console.log(count);
};
};
var counter = closure();
counter() // returns 1
counter() // returns 2
counter() // returns 3
在上面的代码中,计算是由外部函数(环境函数)保存的,所以每次你呼叫计算(),内部函数(工作函数)可以增加它。
关闭是一种功能,它可以从它所定义的环境中获取信息。
对于某些人来说,信息是创造时的环境价值;对于其他人来说,信息是创造时的环境变量。
一个关闭可以想象一个特殊的情况的全球变量 - 与一个私人副本创建仅为功能。
或者它可以被认为是一种方法,环境是对象的具体例子,其属性是环境中的变量。
前者(封闭作为环境)类似于后者,环境复制是前者中的每个函数转移的背景变量,例子变量在后者中形成一个背景变量。
因此,关闭是一种呼叫函数的方式,而无需明确地指定背景为参数或作为方法引用中的对象。
var closure = createclosure(varForClosure);
closure(param1); // closure has access to whatever createclosure gave it access to,
// including the parameter storing varForClosure.
vs
var contextvar = varForClosure; // use a struct for storing more than one..
contextclosure(contextvar, param1);
vs
var contextobj = new contextclass(varForClosure);
contextobj->objclosure(param1);
一个关闭是许多JavaScript开发人员使用的所有时间,但我们认为它是允许的。
var x = 1;
function myFN() {
alert(x); //1, as opposed to undefined.
}
// Or
function a() {
var x = 1;
function b() {
alert(x); //1, as opposed to undefined.
}
b();
}
那么什么呢?
在其他语言中,在函数返回时,函数中使用的变量会被清除,在上面的函数中,x 会是一个“零指标”,你需要设置一个点击和设置并开始通过参考。
我为什么要关心?
但是,正如其他人也指出的那样,它们可以用来创建虚假的私人变量,直到你需要私人变量,只需像你总是一样使用它们。