如何向某人解释JavaScript关闭,知道它们所构成的概念(例如功能、变量等),但不了解关闭本身?
我已经在维基百科上看到了图表的例子,但不幸的是,它没有帮助。
如何向某人解释JavaScript关闭,知道它们所构成的概念(例如功能、变量等),但不了解关闭本身?
我已经在维基百科上看到了图表的例子,但不幸的是,它没有帮助。
当前回答
考虑到这个问题是关于简单地解释它,就像一个6岁的,我的答案是:
“当您在JavaScript中宣布函数时,它将永久地访问在该函数声明之前线上可用的所有变量和函数,该函数和它所访问的所有外部变量和函数都是我们称之为关闭的。
其他回答
關閉的觀點:
封面可以与一本书,一本书标记,一本书架上进行比较。
这类似于关闭,书是外部函数,页面是你的内部函数,从外部函数返回,书标是你的页面的参考,故事的背景是你需要保存的语法范围。
代码例子:
function book() {
var pages = [....]; //array of pages in your book
var bookMarkedPage = 20; //bookmarked page number
function getPage(){
return pages[bookMarkedPage];
}
return getPage;
}
var myBook = book(),
myPage = myBook.getPage();
要考虑的几点:
点1:书架,就像函数板有有限的空间一样,所以要明智地使用它。
点2:想想事实,如果你只想跟踪一个页面时,你是否需要坚持整个书,你可以释放部分记忆,而不是在关闭回来时存储所有页面。
关闭是函数被关闭时,函数被定义为名称空间,函数被召唤时是不可变的。
在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);
}
我喜欢Kyle Simpson的关闭定义:
关闭是函数能够记住和访问其语法范围,即使该函数在其语法范围之外运行。
语法范围是当一个内部范围能够访问其外部范围时。
此分類上一篇: You Don't Know JS: Scopes & Closures
function foo() {
var a = 2;
function bar() {
console.log( a );
}
return bar;
}
function test() {
var bz = foo();
bz();
}
// prints 2. Here function bar referred by var bz is outside
// its lexical scope but it can still access it
test();
我很清楚地发现了JavaScript的第8章第6节“关闭”,《David Flanagan的最终指南》(The Definitive Guide),第6版,O’Reilly,2011年。
当一个函数被召唤时,创建了一个新的对象,以保持该召唤的本地变量,函数的范围取决于其声明位置,而不是其执行位置。
接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來,接下來。
函数和函数的外部范围(语法环境)的参考
函数 汽车(制造商,模型,年,颜色) { 返回 { 到String() { 返回 `${ 制造商} ${ 模型} (${ 年}, ${ 颜色})` } } 组车 = 新车(‘Aston Martin’,‘V8 Vantage’,‘2012’,‘Quantum Silver’) console.log(car.toString())
事件导向的编程
在下面的例子中,所有实施细节都隐藏在即时执行的函数表达式内。 函数标记和 toString 接近私人状态和函数他们需要完成工作。 关闭已使我们能够模块化和包容我们的代码。
例子1
这个例子表明,本地变量在关闭中没有复制:关闭保持了对原始变量的参考。
左边