成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript中閉包的應(yīng)用

hellowoody / 2296人閱讀

摘要:在中,有許多閉包的運(yùn)用。要修改這個(gè)可以引進(jìn)一個(gè)立即執(zhí)行的匿名函數(shù),將當(dāng)前的值傳入封裝變量有時(shí)候我們需要用一個(gè)全局變量來存儲(chǔ)一些在整個(gè)程序運(yùn)行過程中都需要被保存下來的值,例如一組人名和對(duì)應(yīng)。

在javascript中,有許多閉包的運(yùn)用。

1. 事件響應(yīng)函數(shù)

var divs = document.getElementsByTagName("div");
for(var i=0; i<3; i++){
   divs[i].onclick = function(){
       alert(i);
   } 
}

此例中,假設(shè)為3個(gè)div元素添加onclick事件,我們會(huì)發(fā)現(xiàn)無論點(diǎn)擊哪一個(gè)div都會(huì)輸出3。這是因?yàn)槲覀優(yōu)閐iv綁定的onclick事件處理函數(shù)就是一個(gè)閉包,它可以訪問到這個(gè)函數(shù)定義時(shí)所處作用域中的變量。并且事件響應(yīng)是異步觸發(fā)的,當(dāng)點(diǎn)擊某一個(gè)div時(shí),實(shí)際上外層循環(huán)已經(jīng)結(jié)束了,i的值始終為3。

要修改這個(gè)bug可以引進(jìn)一個(gè)立即執(zhí)行的匿名函數(shù),將當(dāng)前的i值傳入:

for(var i=0; i<3; i++){
   function(i){  
     divs[i].onclick = function(){
       alert(i);
     } 
   }(i);
}

2. 封裝變量

有時(shí)候我們需要用一個(gè)全局變量來存儲(chǔ)一些在整個(gè)程序運(yùn)行過程中都需要被保存下來的值,例如一組人名和Id對(duì)應(yīng)。


var persons = {};
var addPerson = function (name,id){
    if(persons.hasOwnProperty(name)){
        return false;
    }
    else {
        persons[name] = id;
        return true;
    }
}

假設(shè)只有在addPerson這個(gè)函數(shù)中我們用到了persons這個(gè)變量,就沒有必要將其暴露給其他的函數(shù)以防止不必要的變量沖突,但是又不能直接將其定義在函數(shù)內(nèi)部,否則會(huì)隨著函數(shù)執(zhí)行完畢而消失。這個(gè)時(shí)候就需要用到閉包了。修改代碼如下:

var addPerson = (function (){
    var persons = {};
    return function(name,id){
        if(persons.hasOwnProperty(name)){
            return false;
        }
        else {
            persons[name] = id;
            return true;
        }
    }
})();

此例中,我們將persons封裝在addPerson函數(shù)內(nèi)部,并且通過在一個(gè)立即執(zhí)行的匿名函數(shù)內(nèi)部return一個(gè)閉包函數(shù)使得addPerson被賦值的這個(gè)函數(shù)(即return的函數(shù))可以訪問到persons這個(gè)變量。

相比于直接在addPerson函數(shù)內(nèi)部定義persons這個(gè)變量,我們同樣通過閉包延續(xù)了變量的生存周期,使其不至于因?yàn)楹瘮?shù)執(zhí)行結(jié)束而被銷毀。

參考《javascript開發(fā)實(shí)踐與設(shè)計(jì)模式》。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/88010.html

相關(guān)文章

  • 掌握Javascript面試:什么是閉包?

    摘要:我的意思是大多數(shù)稱職的面試官會(huì)問你什么是閉包,并且在大多數(shù)時(shí)候你回答錯(cuò)誤將失去這份工作。在閉包的范圍內(nèi)定義的任何公開方法都是特權(quán)的。使對(duì)象的數(shù)據(jù)私有化并不是閉包的唯一用途。 文章來源于:https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36 在J...

    jifei 評(píng)論0 收藏0
  • 【譯】理解JavaScript閉包

    摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專門的主題闡述,不過作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無需我舉其他再多不相干...

    岳光 評(píng)論0 收藏0
  • 溫故js系列(14)-閉包&垃圾回收&內(nèi)存泄露&閉包應(yīng)用&作用域鏈&

    摘要:該對(duì)象包含了函數(shù)的所有局部變量命名參數(shù)參數(shù)集合以及,然后此對(duì)象會(huì)被推入作用域鏈的前端。如果整個(gè)作用域鏈上都無法找到,則返回。此時(shí)的作用域鏈包含了兩個(gè)對(duì)象的活動(dòng)對(duì)象和對(duì)象。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:閉包 JavaScript-閉包 閉包(closure)是一個(gè)讓人又愛又恨的somet...

    Amio 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)系列---閉包及其應(yīng)用

    摘要:所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。所以本文中將以維基百科中的定義為準(zhǔn)即在計(jì)算機(jī)科學(xué)中,閉包,又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。 閉包(closure)是JavaScript中一個(gè)神秘的概念,許多人都對(duì)它難以理解,我也一直處于似懂非懂的狀態(tài),前幾天深入了解了一下執(zhí)行環(huán)境以及作用域鏈,可戳查看詳情,而閉包與作用域及作用域鏈的關(guān)系密不可分,所...

    leoperfect 評(píng)論0 收藏0
  • javascript - 閉包定義及應(yīng)用場(chǎng)景

    摘要:什么是閉包閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。在內(nèi)存中維持一個(gè)變量。 什么是閉包 閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。 function createFunc() { var name = wheeler; return function () { return name; } } var nameFunc = crea...

    Xufc 評(píng)論0 收藏0
  • 理解Javascript閉包

    摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。可惜的是,并沒有提供相關(guān)的成員和方法來訪問閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門文章。Javascript中有幾個(gè)非常重要的語言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個(gè)新的語言特性。本文將...

    dayday_up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<