一、 變量的作用域
一個(gè)變量的作用域(scope)是程序源代碼中定義這個(gè)變量的區(qū)域。按變量作用域可以將變量分為全局變量和局部變量。
全局變量:在JavaScript代碼中任何地方都是有定義的。
局部變量:在函數(shù)體內(nèi)部有定義,作用域是局限性的。
var a = 0; // 全局變量a
function foo1() {
console.log('a = ', a); // 結(jié)果為 a = 0
}
console.log('a = ', a); // 結(jié)果為 a = 0
// --------------
function foo2() {
var b = 10; // 局部變量b
console.log('a = ', a); // 結(jié)果為 a = 0
console.log('b = ', b); // 結(jié)果為 b = 10
}
// console.log('b = ', b) // 打開注釋后報(bào)錯(cuò)結(jié)果為 Uncaught ReferenceError: b is not defined
foo1();
foo2();
二、 閉包
理解上面的變量作用域,下面我們看看,怎么在函數(shù)的外面獲得函數(shù)內(nèi)部變量。
function foo1() {
var a = 20;
// 閉包函數(shù)foo2
function foo2() {
console.log('a = ', a);
return a;
}
return foo2;
}
var b = foo1()(); // a = 20
console.log(b); // 20
foo1包含著一個(gè)函數(shù)foo2,foo2就是一個(gè)閉包。在我看來(lái),閉包就是一個(gè)函數(shù),這個(gè)函數(shù)在另一個(gè)函數(shù)體內(nèi)部,并且向父函數(shù)的外部,返回父函數(shù)內(nèi)部的變量。閉包函數(shù)是父函數(shù)內(nèi)部變量與外界的橋梁。
三、閉包的用途
- 可以用來(lái)讀取函數(shù)內(nèi)部的變量。
- 可以將變量保存在內(nèi)存中,不被垃圾回收機(jī)制回收。
四、閉包的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):可以在函數(shù)外部操作函數(shù)內(nèi)部變量。
缺點(diǎn):由于閉包會(huì)讓函數(shù)體內(nèi)變量常駐內(nèi)存,濫用閉包會(huì)導(dǎo)致內(nèi)存泄露,影響性能。
原文作者:最帥的壞兔子
技術(shù)博客:http://www.itdecent.cn/u/259b7db6cc20
90后,愛編程,愛運(yùn)營(yíng),文藝與代碼齊飛,魅力與智慧共存的全棧開發(fā)一枚。
堅(jiān)持總結(jié)工作中遇到的技術(shù)問(wèn)題,堅(jiān)持記錄工作中所思所見,可以加小編微信一起交流學(xué)習(xí):hxa2wangting13815。