js中匿名函數

來源:互聯網
上載者:User

標籤:logs   func   實參   foo   輸入   代碼   color   優先順序   log   

今天碰到一道題,裡面既包含了匿名函數的知識,也包含了先行編譯,函數的傳參(形參),感覺迷迷糊糊的,所以想著做個總結。

 var foo={n:1};     (function(foo){       console.log(foo.n);       foo.n=3;       var foo={n:2};       console.log(foo.n);     })(foo);     console.log(foo.n);

上面的代碼,可以寫成這樣,看解釋

1 var foo={n:1};2      (function(foo){        //此時形參和實參指向相同的記憶體空間,且空間的值n為13        var foo;             //變數的提升,一個變數的聲明優先順序低於形參,so這行相當於無效4        console.log(foo.n);  //這裡應當輸出15        foo.n=3;             //形參和實參的指向的記憶體空間發生了改變,值現在變為36        var foo={n:2};       //這行很關鍵,開闢了新的記憶體空間,n的值為27        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出28      })(foo);9      console.log(foo.n);    //之前的記憶體空間值為3,所以輸出3
結果輸出 1 2 3

按照上面的思路,如果第五行和第六行換一下呢

1 var foo={n:1};2      (function(foo){        //此時形參和實參指向相同的記憶體空間,且空間的值n為13        var foo;             //變數的提升,一個變數的聲明優先順序低於形參,so這行相當於無效4        console.log(foo.n);  //這裡應當輸出15        var foo={n:2};      //這行很關鍵,開闢了新的記憶體空間和之前的已經斷開聯絡,n的值為26        foo.n=3;             //改變了新的記憶體空間裡面的值,值現在變為37        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出38      })(foo);9      console.log(foo.n);    //之前的記憶體空間值為1,所以輸出1
結果輸出 1 3 1

ok   那接下來這個呢

1  var foo={n:1};2      (function(foo){        //此時形參和實參指向相同的記憶體空間,且空間的值n為13        var foo;             //變數的提升,一個變數的聲明優先順序低於形參,so這行相當於無效4        console.log(foo.n);  //這裡應當輸出15        foo.n=3;             //形參和實參的指向的記憶體空間發生了改變,值現在變為36        foo.n=2              //並沒有開闢了新的記憶體空間,在原來的基礎上修改的,n的值為27        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出28      })(foo);9      console.log(foo.n);    //原始的的記憶體空間值經過修改變為2,所以輸出2
結果輸出 1 2 2

下面和上面一樣了

1 var foo={n:1};2      (function(foo){        //此時形參和實參指向相同的記憶體空間,且空間的值n為13        var foo;             //變數的提升,一個變數的聲明優先順序低於形參,so這行相當於無效4        console.log(foo.n);  //這裡應當輸出15        foo.n=2;             //形參和實參的指向的記憶體空間發生了改變,值現在變為26        foo.n=3;              //並沒有開闢了新的記憶體空間,在原來的基礎上修改的,n的值為37        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出38      })(foo);9      console.log(foo.n);    //原始的記憶體空間的值經過修改變為3,所以輸出3
結果輸出 1 3 3

那下面這個呢(第五行和第六行都改變了指向,由於並不是在原來的基礎上修改的,所以最後輸入的值不變)

1    var foo={n:1};2      (function(foo){        //此時形參和實參指向相同的記憶體空間,且空間的值n為13        var foo;             //變數的提升,一個變數的聲明優先順序低於形參,so這行相當於無效4        console.log(foo.n);  //這裡應當輸出15        var foo={n:2};             //開闢了新的記憶體空間,n的值為26        var foo={n:3};          //開闢了新的記憶體空間,n的值為37        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出38      })(foo);9      console.log(foo.n);    //原始的記憶體空間的值為1,並沒被有被修改,所以輸出1
結果輸出 1 3 1

這個就和上面的一樣了

1    var foo={n:1};2      (function(foo){        //此時形參和實參指向相同的記憶體空間,且空間的值n為13        var foo;             //變數的提升,一個變數的聲明優先順序低於形參,so這行相當於無效4        console.log(foo.n);  //這裡應當輸出15        var foo={n:3};            //開闢了新的記憶體空間,n的值為36        var foo={n:2};          //開闢了新的記憶體空間,n的值為27        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出28      })(foo);9      console.log(foo.n);    //原始的記憶體空間並未被修改,所以輸出1
結果輸出 1 2 1

以上為小弟解讀,如果過錯還請大神指教。

 

js中匿名函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.