我理解的閉包

一、 變量的作用域

一個(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)部變量與外界的橋梁。

三、閉包的用途

  1. 可以用來(lái)讀取函數(shù)內(nèi)部的變量。
  2. 可以將變量保存在內(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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容