標籤: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中匿名函數