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

JavaScript閉包函數(shù)訪問外部變量的方法

 更新時間:2014年08月27日 10:31:55   作者:瓊臺  
這篇文章主要介紹了JavaScript閉包函數(shù)訪問外部變量的方法,本文使用匿名函數(shù)來實現(xiàn)在閉包中訪問外部變量,需要的朋友可以參考下

閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù),但作用域的配置機制有一個需要注意的地方,即閉包只能取得包含函數(shù)中任何變量的最后一個值。

如以下案例:

function create(){
    var arr = new Array();  
 
    for (var i=0; i<10; i++){
        arr[i] = function(){
            return i;
        };  
    }
 
    return arr;
}
 
var c_arr = create();
 
for(var i=0; i<c_arr.length;i++){
    document.write("c_arr["+i+"] = "+c_arr[i]()+"<br />");    
}

執(zhí)行結(jié)果:

JS閉包

表面上看,似乎每個函數(shù)返回的i值都不相同,比如c_arr[0]的值應(yīng)該是0,c_arr[1]的值應(yīng)該是1,以此類推??山Y(jié)果每個函數(shù)都返回10。為什么呢?

因為每個函數(shù)的作用域鏈中保存著create()函數(shù)的活動對象,所以它們引用的都是同一個變量i。當(dāng)for循環(huán)結(jié)束以后,i的值也就變成10了,此時每個函數(shù)都引用保存變量i的同一個變量對象。

 

我們可以通過創(chuàng)建另一個域名函數(shù)強制讓閉包的行為符合預(yù)期,使每個位置對應(yīng)相應(yīng)的值。

function create(){
    var arr = new Array();  
 
    for (var i=0; i<10; i++){
        arr[i] = function(num){
            return function(){
                return num; 
            };
        }(i);   
    }
 
    return arr;
}
 
var c_arr = create();
 
for(var i=0; i<c_arr.length;i++){
    document.write("c_arr["+i+"] = "+c_arr[i]()+"<br />");    
}

執(zhí)行結(jié)果:

JS閉包

定義了一個匿名函數(shù),并立即執(zhí)行匿名函數(shù)的機過賦給數(shù)組,這里匿名函數(shù)有一個參數(shù)num,也就是最終的函數(shù)要返回的值。在調(diào)用每個函數(shù)時我們傳入變量i。由于函數(shù)參數(shù)是按值傳遞的,所以就會將變量i的當(dāng)前值賦值給參數(shù)num。而在這個匿名函數(shù)內(nèi)部,又創(chuàng)建并返回了一個訪問num的閉包,這樣一來arr數(shù)組中的每個函數(shù)都有自己num變量的一個副本,因此就可以返回各自不同的數(shù)值了。

經(jīng)典例子

我們再來看一個經(jīng)典的例子,假設(shè)頁面有一組button標(biāo)簽,我們利用腳本給這組button標(biāo)簽綁定單擊事件,并且單擊時能彈出這是第幾個標(biāo)簽。

<meta charset="utf-8" />
 
<button>第一個</button>
<button>第二個</button>
<button>第三個</button>
<button>第四個</button>
 
 
<script type="text/javascript">
 
var obj = document.getElementsByTagName('button');
for(var i=0;i<obj.length;i++){
    obj[i].onclick = function(){
        alert(i);
    };  
}
 
</script>

點擊每一個按鈕結(jié)果

JS閉包

表面上看,似乎單擊每一個標(biāo)簽應(yīng)該彈出不同數(shù)字

第一個應(yīng)該彈出0;

第二個應(yīng)該彈出1;

以此類推。

可結(jié)果是所有按鈕都彈出4,顯然這不是我們想要的結(jié)果。

我們把程序改一下

<meta charset="utf-8" />
 
<button>第一個</button>
<button>第二個</button>
<button>第三個</button>
<button>第四個</button>
 
 
<script type="text/javascript">
 
var obj = document.getElementsByTagName('button');
for(var i=0;i<obj.length;i++){
    obj[i].onclick = function(num){
        return function(){
            alert(num);
        }       
    }(i);       
}
 
</script>

點擊第二個

JS閉包

點擊第四個

JS閉包

我們只需要在函數(shù)內(nèi)建立一個匿名函數(shù),同以上案例同理。即可實現(xiàn)匿名函數(shù)捕獲外部變量i,結(jié)果每個按鈕彈的i值都不同。

相關(guān)文章

  • 詳解js刪除數(shù)組中的指定元素

    詳解js刪除數(shù)組中的指定元素

    在本篇文章中我們給大家分享了js刪除數(shù)組中的指定元素的詳實示例方法,有需要的朋友們學(xué)習(xí)下
    2018-10-10
  • 深入理解JavaScript系列(9) 根本沒有“JSON對象”這回事!

    深入理解JavaScript系列(9) 根本沒有“JSON對象”這回事!

    寫這篇文章的目的是經(jīng)??吹介_發(fā)人員說:把字符串轉(zhuǎn)化為JSON對象,把JSON對象轉(zhuǎn)化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯誤,請大家指出,多謝
    2012-01-01
  • 一文搞懂JavaScript中的內(nèi)存泄露

    一文搞懂JavaScript中的內(nèi)存泄露

    以前我們說的內(nèi)存泄漏,通常發(fā)生在后端,但是不代表前端就不會有內(nèi)存泄漏。特別是當(dāng)前端項目變得越來越復(fù)雜后,前端也逐漸稱為內(nèi)存泄漏的高發(fā)區(qū)。本文就帶大家了解一下Javascript的內(nèi)存泄漏
    2022-06-06
  • 使用正則表達式的格式化與高亮顯示json字符串

    使用正則表達式的格式化與高亮顯示json字符串

    這篇文章主要介紹了使用正則表達式的格式化與高亮顯示json字符串的方法,非常的簡單實用,需要的朋友可以參考下
    2014-12-12
  • 微信jssdk踩坑之簽名錯誤invalid signature

    微信jssdk踩坑之簽名錯誤invalid signature

    這篇文章主要介紹了微信jssdk踩坑之簽名錯誤invalid signature,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • JavaScript中這6個新特性你都了解了嗎

    JavaScript中這6個新特性你都了解了嗎

    作為一門不斷演進的語言,JavaScript每年都會引入新特性,這篇文章主要為大家整理了一些個人認為特別有用的新JavaScript特性,以及一些補充的實例代碼,希望對大家有所幫助
    2024-01-01
  • JavaScript實現(xiàn)簡易輪播圖最全代碼解析(ES6面向?qū)ο?

    JavaScript實現(xiàn)簡易輪播圖最全代碼解析(ES6面向?qū)ο?

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)簡易輪播圖最全代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • js TextArea的選中區(qū)域處理

    js TextArea的選中區(qū)域處理

    js中對于TextArea的選中區(qū)域后進行處理的代碼,需要的朋友可以參考下。
    2010-12-12
  • javascript模擬post提交隱藏地址欄的參數(shù)

    javascript模擬post提交隱藏地址欄的參數(shù)

    想要隱藏地址欄的參數(shù),就只能用javascript模擬post提交,下面是示例代碼,需要的朋友可以看看
    2014-09-09
  • uni-app實現(xiàn)頁面通信EventChannel的操作方法

    uni-app實現(xiàn)頁面通信EventChannel的操作方法

    使用了EventBus的方法實現(xiàn)不同頁面組件之間的一個通信,在uni-app中,我們也可以使用uni-app API,uni.navigateTo來實現(xiàn)頁面間的通信,這篇文章主要介紹了uni-app實現(xiàn)頁面通信EventChannel的操作方法,需要的朋友可以參考下
    2024-05-05

最新評論

辽阳市| 元氏县| 宁乡县| 茌平县| 遂溪县| 老河口市| 武宣县| 钟祥市| 扶余县| 榆中县| 巴中市| 林甸县| 阿克| 稻城县| 高唐县| 浮山县| 新泰市| 麟游县| 延津县| 濮阳县| 华蓥市| 玛纳斯县| 黑水县| 察隅县| 铁岭市| 宜兴市| 常山县| 芮城县| 辽源市| 积石山| 璧山县| 修武县| 泊头市| 固镇县| 德安县| 门源| 六盘水市| 登封市| 青浦区| 大姚县| 梅河口市|