久久99热66热这里只有精品,特黄特色的大片在线观看,亚洲日本三级在线观看,国产三级农村妇女在线,亚洲av毛片免费在线观看,哺乳叫自慰在线看,天天干美女av网

js 閉包之一 -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【m.dameics.com - 電腦資料】

    既然說閉包的化,我們就先來說說函數(shù),

js 閉包之一

。慢慢的進(jìn)入進(jìn)入正題

    (1)函數(shù)申明

    f1();

    function f1(){

    alert("1")

    }//結(jié)果 1

    (2)函數(shù)定義

    f1();

    var f1=function(){

    alert(''1")

    }// 直接報(bào)錯(cuò)了

    其實(shí)原因是這樣的函數(shù)申明:會(huì)在代碼執(zhí)行之前提前加載到作用域中這樣在執(zhí)行發(fā)f1()的時(shí)候就可以找到了。但是函數(shù)的定義是:先在內(nèi)存里賣弄?jiǎng)?chuàng)建了一塊區(qū)域,之后通過一個(gè)f1() 指針指向這塊區(qū)域,開始的時(shí)候這塊區(qū)域是沒有名字的.

    函數(shù)的作用域鏈

    var number="a";

    var showNumber=function(){

    alert(this.number);

    }

    function changeNumber(){

    var anothernumber="b";

    function savenumber(){

    var tempnumber=anothernumber;

    anothernumber=number;

    number=tempnumber

    }

    savenumber();

    }

    changeNumber();

    showNumber() //結(jié)果是“b”

    其實(shí)我的理解就是,在進(jìn)行js 函數(shù)調(diào)用的時(shí)候,會(huì)為每一個(gè)函數(shù)自動(dòng)的添加一個(gè)scope屬性通過這個(gè)屬性來指向一塊內(nèi)存,然后這個(gè)內(nèi)存就會(huì)包含這個(gè)這個(gè)函數(shù)的上下文相關(guān)的變量,如果這個(gè)函數(shù)里面又包含了一個(gè)新的函數(shù),那么又會(huì)自動(dòng)的分配一塊內(nèi)存,當(dāng)然這個(gè)函數(shù)又會(huì)自動(dòng)的繼承了他的上級(jí)所執(zhí)行的變量(這個(gè)繼承可能說的不太對(duì)感覺是這個(gè)意思?)

    其實(shí)可以這么理解哈。我們?cè)趲д{(diào)用changnumber()的時(shí)候首先changenumber()這個(gè)函數(shù)的作用域鏈包括自己的(anothernumber 這個(gè)變量,然后就是savenumber()。最后就是上文的作用域,也就是number()和shownumber()這個(gè)全局的。這個(gè)時(shí)候savenumber 也會(huì)被執(zhí)行那么他就會(huì)去繼承他的上一級(jí)的作用域,和上上級(jí)的作用域,)那么這個(gè)時(shí)候savenumer去改變number 的值,這個(gè)時(shí)候number 的值就是b,最后當(dāng)我們調(diào)用shownumber()的時(shí)候自然出現(xiàn)的值就是結(jié)果“b”了,

電腦資料

js 閉包之一》(http://m.dameics.com)。

    我看一個(gè)例子看看閉包產(chǎn)生的原因:

    function compareObjectFunction(prop){

    //匿名函數(shù)

    return function(obj1>obj2{

    if(obj1[prop]>obj2[prop]) return 1;

    else if(obj1[prop

    else return 0;

    })

    }

    var o1={name:"Leon",age:23};

    var o2={name:"Ade",age:28};

    /*

    在中這個(gè)時(shí)候變量并沒有被釋放,于是這個(gè)時(shí)候作用域就變大了

    */

    var compare=compareObjectFunction("age");

    var rel=compare(o1,o2);

    alert(rel1)

    復(fù)制代碼

    我們看看他的作用域鏈

    于是我們來解釋一下到底是如何實(shí)現(xiàn)的。首先我們執(zhí)行compareobjectfunction()的時(shí)候會(huì)產(chǎn)什么如下的作用域鏈Global和compareobject()這個(gè)。當(dāng)compareobjecfunction執(zhí)行完過后我們就會(huì)釋放相應(yīng)的作用域但是這個(gè)時(shí)候com這個(gè)匿名函數(shù)指向了相同的作用域,Global和compareobject()這個(gè)時(shí)候并不會(huì)發(fā)生釋放這個(gè)作用域的動(dòng)作,于是compar、這個(gè)就獲取到相應(yīng)的參數(shù)了。于是乎作用域就發(fā)生了擴(kuò)大。這個(gè)就是閉包產(chǎn)生的原理。其實(shí)我的理解就是里面的函數(shù)調(diào)用了外部函數(shù)的變量(或者說擴(kuò)大了函數(shù)的訪問變量的范圍)

    下面我們?cè)賮砜匆粋(gè)例子:

    function fn1(){

    var fns=new Array();

    for(var i=0;i<10;i++){

    fns[i]=function(){

    return 1;

    }

    }

    return fns;

    }

    var fs=fn1();

    for(var i=0;i

    {

    alert(fs[i]())

    }

最新文章