溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript閉包使用實(shí)例分析

發(fā)布時(shí)間:2022-05-07 11:00:08 來(lái)源:億速云 閱讀:166 作者:zzz 欄目:大數(shù)據(jù)

這篇文章主要介紹“JavaScript閉包使用實(shí)例分析”,在日常操作中,相信很多人在JavaScript閉包使用實(shí)例分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JavaScript閉包使用實(shí)例分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

變量作用域

在學(xué)習(xí)閉包之前,我們首先要理解JavaScript不同與其他語(yǔ)言獨(dú)特的變量作用域。在JavaScript中,不存在局部作用域的概念,但是有全局作用域以及函數(shù)作用域。全局作用域與其他語(yǔ)言的相同,沒(méi)有需要注意的地方,而函數(shù)作用域是指函數(shù)內(nèi)部聲明的變量在函數(shù)外部無(wú)法直接訪問(wèn)。

var a = 99;
function f1() {
  console.log(a);
}
f1();

上面的代碼中,f1可以讀取到全局變量a,而下面的代碼中a無(wú)法被訪問(wèn)。

function f1() {
  var a = 99;
}
console.log(a);

如何從外部讀取函數(shù)內(nèi)部聲明的變量?

在某些情況下,我們可能需要得到函數(shù)內(nèi)部的變量,正常情況下是無(wú)法做到的,因此需要用特殊的辦法。

function f1() {
  var a = 99;
  function f2() {
    console.log(a);
  }
}

上面代碼中,我們?cè)诤瘮?shù)f1中定義另一個(gè)函數(shù)f2,這樣f1中的所有變量對(duì)于f2來(lái)說(shuō)就是可見(jiàn)的,既然f2可以讀取到f1中的變量,那么我們只要把f2作為f1的返回值,我們就可以在f1的外部讀取到它內(nèi)部的變量了。

function f1() {
  var a = 99;
  function f2() {
    console.log(a);
  }
  return f2;
}
var result = f1();
result();

此時(shí),就形成了一個(gè)簡(jiǎn)單的閉包。因此,閉包就可以簡(jiǎn)單的理解為函數(shù)中的函數(shù),而本質(zhì)上,閉包就是一個(gè)連接函數(shù)內(nèi)部和外部的橋梁。

閉包的特性

閉包會(huì)使得函數(shù)中的變量都被保存到內(nèi)存中。首先我們先看一下以下兩個(gè)例子

function A() {
  var count = 0;
  function B() {
    count++;
    console.log(count);
  }
  return B;
}
var C = A();
C(); // 1
C(); // 2
C(); // 3

count是函數(shù)A中的一個(gè)變量,它的值在函數(shù)B中被改變,函數(shù)B每執(zhí)行一次,count的值就在原來(lái)的基礎(chǔ)上累加1,因此,函數(shù)A中的count變量會(huì)一直保存在內(nèi)存中。

function A(x) {
  function B(y) {
    console.log(x+y);
  }
return B;
}
var C = A(3);
C(5); //8

當(dāng)3傳入A函數(shù)后,B函數(shù)就會(huì)記住這個(gè)值,所以在后面?zhèn)魅?的時(shí)候只會(huì)對(duì)B函數(shù)中的y賦值,所以最后會(huì)輸出8。

使用閉包的注意點(diǎn)

由于上述閉包的特性,每次使用閉包都會(huì)大量增加內(nèi)存的消耗,所以不能濫用閉包,否則會(huì)影響網(wǎng)頁(yè)的性能。我們也可以在函數(shù)退出前,使函數(shù)內(nèi)變量指向null來(lái)手動(dòng)刪除變量。我們可以來(lái)看下一道經(jīng)典的面試題來(lái)理解。

function outer(){
  var num = 0; //內(nèi)部變量
  return function add() { //通過(guò)return返回add函數(shù),就可以在outer函數(shù)外訪問(wèn)了
    num++; //內(nèi)部函數(shù)有引用,作為add函數(shù)的一部分了
    console.log(num);
  };
}
var func1 = outer();
func1(); //實(shí)際上是調(diào)用add函數(shù), 輸出1
func1(); //輸出2 因?yàn)閛uter函數(shù)內(nèi)部的私有作用域會(huì)一直被占用
var func2 = outer();
func2(); // 輸出1 每次重新引用函數(shù)的時(shí)候,閉包是全新的。
func2(); // 輸出2

到此,關(guān)于“JavaScript閉包使用實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI