1. 程式人生 > >js中匿名函數

js中匿名函數

基礎上 不變 解讀 代碼 spa 空間 cti 知識 匿名

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

 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為1
3 var foo; //變量的提升,一個變量的聲明優先級低於形參,so這行相當於無效 4 console.log(foo.n); //這裏應當輸出1 5 foo.n=3; //形參和實參的指向的內存空間發生了改變,值現在變為3 6 var foo={n:2}; //這行很關鍵,開辟了新的內存空間,n的值為2 7 console.log(foo.n); //由於js中的代碼是自上而下執行,所以此時輸出2 8 })(foo); 9 console.log(foo.n); //
之前的內存空間值為3,所以輸出3
結果輸出 1 2 3

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

1 var foo={n:1};
2      (function(foo){        //此時形參和實參指向相同的內存空間,且空間的值n為1
3        var foo;             //變量的提升,一個變量的聲明優先級低於形參,so這行相當於無效
4        console.log(foo.n);  //這裏應當輸出1
5        var foo={n:2};      //這行很關鍵,開辟了新的內存空間和之前的已經斷開聯系,n的值為2
6        foo.n=3;             //
改變了新的內存空間裏面的值,值現在變為3 7 console.log(foo.n); //由於js中的代碼是自上而下執行,所以此時輸出3 8 })(foo); 9 console.log(foo.n); //之前的內存空間值為1,所以輸出1
結果輸出 1 3 1

ok 那接下來這個呢

1  var foo={n:1};
2      (function(foo){        //此時形參和實參指向相同的內存空間,且空間的值n為1
3        var foo;             //變量的提升,一個變量的聲明優先級低於形參,so這行相當於無效
4        console.log(foo.n);  //這裏應當輸出1
5        foo.n=3;             //形參和實參的指向的內存空間發生了改變,值現在變為3
6        foo.n=2              //並沒有開辟了新的內存空間,在原來的基礎上修改的,n的值為2
7        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出2
8      })(foo);
9      console.log(foo.n);    //原始的的內存空間值經過修改變為2,所以輸出2
結果輸出 1 2 2

下面和上面一樣了

1 var foo={n:1};
2      (function(foo){        //此時形參和實參指向相同的內存空間,且空間的值n為1
3        var foo;             //變量的提升,一個變量的聲明優先級低於形參,so這行相當於無效
4        console.log(foo.n);  //這裏應當輸出1
5        foo.n=2;             //形參和實參的指向的內存空間發生了改變,值現在變為2
6        foo.n=3;              //並沒有開辟了新的內存空間,在原來的基礎上修改的,n的值為3
7        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出3
8      })(foo);
9      console.log(foo.n);    //原始的內存空間的值經過修改變為3,所以輸出3
結果輸出 1 3 3

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

1    var foo={n:1};
2      (function(foo){        //此時形參和實參指向相同的內存空間,且空間的值n為1
3        var foo;             //變量的提升,一個變量的聲明優先級低於形參,so這行相當於無效
4        console.log(foo.n);  //這裏應當輸出1
5        var foo={n:2};             //開辟了新的內存空間,n的值為2
6        var foo={n:3};          //開辟了新的內存空間,n的值為3
7        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出3
8      })(foo);
9      console.log(foo.n);    //原始的內存空間的值為1,並沒被有被修改,所以輸出1
結果輸出 1 3 1

這個就和上面的一樣了

1    var foo={n:1};
2      (function(foo){        //此時形參和實參指向相同的內存空間,且空間的值n為1
3        var foo;             //變量的提升,一個變量的聲明優先級低於形參,so這行相當於無效
4        console.log(foo.n);  //這裏應當輸出1
5        var foo={n:3};            //開辟了新的內存空間,n的值為3
6        var foo={n:2};          //開辟了新的內存空間,n的值為2
7        console.log(foo.n);  //由於js中的代碼是自上而下執行,所以此時輸出2
8      })(foo);
9      console.log(foo.n);    //原始的內存空間並未被修改,所以輸出1
結果輸出 1 2 1

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

js中匿名函數