最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript閉包相關(guān)知識(shí)解析

 更新時(shí)間:2019年10月19日 09:25:45   作者:鱈魚堡  
這篇文章主要介紹了JavaScript閉包相關(guān)知識(shí)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

閉包是JavaScript中的一個(gè)難點(diǎn),同時(shí)也是它的特色,JavaScript的很多高級(jí)應(yīng)用都要依靠閉包來實(shí)現(xiàn)。以下是我學(xué)習(xí)閉包的記錄,希望對(duì)你有些幫助。

變量作用域

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

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

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

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

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

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

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

上面代碼中,我們?cè)诤瘮?shù)f1中定義另一個(gè)函數(shù)f2,這樣f1中的所有變量對(duì)于f2來說就是可見的,既然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的值就在原來的基礎(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來手動(dòng)刪除變量。我們可以來看下一道經(jīng)典的面試題來理解。

function outer(){
  var num = 0; //內(nèi)部變量
  return function add() { //通過return返回add函數(shù),就可以在outer函數(shù)外訪問了
    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 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 實(shí)時(shí)編輯網(wǎng)頁(yè)網(wǎng)頁(yè)文字實(shí)時(shí)編輯,如同TEXTBOX一般

    實(shí)時(shí)編輯網(wǎng)頁(yè)網(wǎng)頁(yè)文字實(shí)時(shí)編輯,如同TEXTBOX一般

    實(shí)時(shí)編輯網(wǎng)頁(yè)網(wǎng)頁(yè)文字實(shí)時(shí)編輯,如同TEXTBOX一般...
    2007-03-03
  • 炫酷的js手風(fēng)琴效果

    炫酷的js手風(fēng)琴效果

    既然JQ和JS都能實(shí)現(xiàn)那么炫酷的效果,我們用CSS3能不能做出手風(fēng)琴效果的書簽來呢?這篇文章主要為大家分享了炫酷的手風(fēng)琴效果實(shí)現(xiàn)方式,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖

    JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用Canvas實(shí)現(xiàn)繪制簡(jiǎn)單的柱狀圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • JS 中forEach,for in、for of用法實(shí)例總結(jié)

    JS 中forEach,for in、for of用法實(shí)例總結(jié)

    這篇文章主要介紹了JS 中forEach,for in、for of用法,結(jié)合實(shí)例形式總結(jié)分析了JS 中forEach,for in、for of的基本功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • 分享javascript計(jì)算時(shí)間差的示例代碼

    分享javascript計(jì)算時(shí)間差的示例代碼

    這篇文章主要為大家介紹了javascript計(jì)算時(shí)間差的示例代碼,,一般來說都是計(jì)算當(dāng)前時(shí)間和一個(gè)指定時(shí)間點(diǎn)之間的差距,感興趣的小伙伴們可以參考一下
    2016-01-01
  • js事件源window.event.srcElement兼容性寫法(詳解)

    js事件源window.event.srcElement兼容性寫法(詳解)

    下面小編就為大家?guī)硪黄猨s事件源window.event.srcElement兼容性寫法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • TypeScript安裝與使用的詳細(xì)教程

    TypeScript安裝與使用的詳細(xì)教程

    TypeScript是JavaScript的超集,擴(kuò)展了JavaScript的語(yǔ)法,因此現(xiàn)有的JavaScript代碼可與TypeScript一起工作無需任何修改,TypeScript通過類型注解提供編譯時(shí)的靜態(tài)類型檢查,下面這篇文章主要給大家介紹了關(guān)于TypeScript安裝與使用的詳細(xì)教程,需要的朋友可以參考下
    2023-01-01
  • JavaScript編程的10+最佳實(shí)踐解決方案

    JavaScript編程的10+最佳實(shí)踐解決方案

    在現(xiàn)代Web開發(fā)中,JavaScript已經(jīng)成為無法替代的核心技術(shù),在現(xiàn)代Web開發(fā)中,JavaScript已經(jīng)成為無法替代的核心技術(shù),本文將通過代碼示例詳細(xì)介紹一些實(shí)踐解決方案,感興趣的同學(xué)可以參考下
    2023-06-06
  • TopList標(biāo)簽和JavaScript結(jié)合兩例

    TopList標(biāo)簽和JavaScript結(jié)合兩例

    TopList標(biāo)簽和JavaScript結(jié)合兩例...
    2007-08-08
  • highcharts.js數(shù)據(jù)綁定方式代碼實(shí)例

    highcharts.js數(shù)據(jù)綁定方式代碼實(shí)例

    這篇文章主要介紹了highcharts.js數(shù)據(jù)綁定方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

自治县| 鹤庆县| 额敏县| 安塞县| 萨迦县| 涿鹿县| 尼勒克县| 年辖:市辖区| 滦南县| 弥渡县| 遂川县| 从江县| 青铜峡市| 婺源县| 开江县| 同德县| 芮城县| 阜南县| 秭归县| 嘉善县| 大埔区| 文山县| 八宿县| 项城市| 天全县| 东阿县| 武冈市| 翁牛特旗| 亚东县| 宁都县| 镇赉县| 沙洋县| 竹溪县| 禄丰县| 札达县| 揭东县| 枣阳市| 思茅市| 微博| 平南县| 澄城县|