|
|
|
|
|
大多數(shù) JavaScript 教程只是深入探討 JavaScript 基礎(chǔ)知識,例如值或變量,并沒有真正深入討論閉包和作用域。盡管它們被忽視了,但作用域和閉包是 JavaScript 的基礎(chǔ)知識。
在這篇文章中,對于熟悉 JavaScript 的人和新手來說,閉包的概念都盡可能地簡潔明了,并且在 3 分鐘的閱讀時間內(nèi)就結(jié)束了。
什么是閉包?
在一個不太專業(yè)的定義中,閉包只是在函數(shù)范圍內(nèi)引用另一個函數(shù)中的變量的行為。當(dāng)函數(shù)在函數(shù)內(nèi)部聲明時,內(nèi)部函數(shù)可以引用在外部函數(shù)中聲明的變量。
看看這段代碼,這里形成了一個閉包:
// 外部函數(shù)
function greet() {
var name = "WebKaka";
// 內(nèi)部函數(shù)
function displayName() {
console.log('Hi' + ' ' + name);
}
// 調(diào)用內(nèi)部函數(shù)
displayName();
}
// 調(diào)用外部函數(shù)
greet();
輸出
Hi WebKaka
閉包尊重范圍。從不同函數(shù)聲明的變量完全不能在其兄弟計數(shù)器部分中引用,因為它在范圍之外。
閉包對變量的調(diào)用限制
JavaScript中的閉包帶來了變量的限制,JavaScript 想讓你編寫一個有條理的干凈代碼,這就是考慮閉包的原因。不僅僅是在任何地方分配任何變量并在任何地方調(diào)用它。這樣你可能會變得非?;靵y,甚至忘記哪個變量屬于哪個函數(shù)。
考慮下面的代碼:
// 外部函數(shù)
function greet() {
var name = "WebKaka";
// 內(nèi)部函數(shù)
function displayName() {
alert(name);
}
// 調(diào)用內(nèi)部函數(shù)
displayName();
}
// 調(diào)用外部函數(shù)
greet();
// 外部函數(shù)
function greeting() {
var myName = "卡卡網(wǎng)";
// 內(nèi)部函數(shù)
function displayName() {
alert(name);
}
// 調(diào)用內(nèi)部函數(shù)
displayName();
}
// 調(diào)用外部函數(shù)
greeting();
greeting
函數(shù)中的 alert
方法不會執(zhí)行其功能,因為它試圖從其范圍之外的同級函數(shù)調(diào)用“var name
”。除非它從其父函數(shù)調(diào)用“var name
”,否則它將無法執(zhí)行其功能。如改為下面的寫法,greeting
函數(shù)中的alert
方法就能執(zhí)行其功能:
// 外部函數(shù)
function greet() {
var name = "WebKaka";
// 內(nèi)部函數(shù)
function displayName() {
//alert(name);
}
// 調(diào)用內(nèi)部函數(shù)
displayName();
function greeting() {
var myName = "卡卡網(wǎng)";
function displayName() {
alert(name);
}
displayName();
}
greeting();
}
// 調(diào)用外部函數(shù)
greet();
執(zhí)行結(jié)果
唯一不真正尊重閉包的變量是全局變量,它們通常在編程環(huán)境的頂部聲明,這種變量即使在程序中的任何地方聲明,它們也被視為在程序的開頭聲明,并且可以被環(huán)境中的任何函數(shù)調(diào)用。
閉包的概念允許你閱讀程序流,考慮變量之間的關(guān)系以及在指定范圍內(nèi)可能調(diào)用或引用的變量。
關(guān)鍵要點:
總結(jié)
本文通過簡單實例,介紹了JavaScript閉包的概念,以及了解何時可以使用閉包,何時不使用閉包。
相關(guān)文章