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

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

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

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

如以下案例:

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閉包

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

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

 

我們可以通過創(chuàng)建另一個(gè)域名函數(shù)強(qiáng)制讓閉包的行為符合預(yù)期,使每個(gè)位置對應(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閉包

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

經(jīng)典例子

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

<meta charset="utf-8" />
 
<button>第一個(gè)</button>
<button>第二個(gè)</button>
<button>第三個(gè)</button>
<button>第四個(gè)</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>

點(diǎn)擊每一個(gè)按鈕結(jié)果

JS閉包

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

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

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

以此類推。

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

我們把程序改一下

<meta charset="utf-8" />
 
<button>第一個(gè)</button>
<button>第二個(gè)</button>
<button>第三個(gè)</button>
<button>第四個(gè)</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>

點(diǎn)擊第二個(gè)

JS閉包

點(diǎn)擊第四個(gè)

JS閉包

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    微信jssdk踩坑之簽名錯(cuò)誤invalid signature

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

    JavaScript中這6個(gè)新特性你都了解了嗎

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

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

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

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

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

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

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

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

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

最新評論

红原县| 安龙县| 宜春市| 乳源| 南阳市| 崇信县| 左贡县| 修水县| 布尔津县| 拉萨市| 年辖:市辖区| 临江市| 峨边| 靖安县| 枣强县| 新闻| 浮山县| 偏关县| 佛坪县| 临邑县| 那坡县| 增城市| 宁安市| 太保市| 泰顺县| 巴彦淖尔市| 沛县| 延长县| 察哈| 周口市| 搜索| 渑池县| 南川市| 平原县| 景洪市| 和龙市| 清镇市| 嘉兴市| 旬阳县| 临西县| 松原市|