js中匿名函數
阿新 • • 發佈:2017-08-30
基礎上 不變 解讀 代碼 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為13 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中匿名函數