今天看了前端網(wǎng)上關(guān)于JS的題目,其中有一道題目挺有意思的。如下
1 var a = b =10;2 (function(){3 var a = b = 20;4 })();5 console.log(a);6 console.log(b);7 問:輸出的 a = ? b = ?
你們想到的結(jié)果是什么?
也許絕大多數(shù)人和我一樣認為是20、20 。然而答案是10、20,別急我們先來慢慢分析(*^__^*) 嘻嘻……,
1.首先第一行的 var a = b = 10; 就是用了連等操作符,連等操作符是從右向左的 所以類似于b = 10; a = b;或者是 a = (b = 10);這樣的順序進行從右向左的賦值的。
變量a是用var進行聲明并賦值的所以是局部變量,但是b是未聲明而直接進行賦值的所以是全局變量。所以使用連等操作符的時候要不會出現(xiàn)全局變量要不就是使用作用域鏈后端的變量。
2.從第二行開始使用匿名函數(shù)實現(xiàn)模仿塊級作用于(私有作用域):在里面聲明的變量會在函數(shù)結(jié)束后被銷毀除非被外部所使用。第三行進行連等操作,先使用外部局部變量b,b =20; 然后又重新聲明了一個變量a
這是一個跨級作用域重新聲明的a和外部沒有任何一點關(guān)系,你可以把它看成任何其它變量不如說var x;
|
然后 var a = b;初始化后的 a為20.
3.第四行聲明定義一個匿名函數(shù)后隨即執(zhí)行,私有作用域中創(chuàng)建的變量a在結(jié)束后隨即被銷毀.所以最后改變的只有外部的變量b的值.
趁熱打鐵,我們再來看一道類似的連等操作賦值問題. 如下
1 想想結(jié)果是多少吧?2 var a = {n:1}; 3 var b = a;4 a.x = a = {n:2};5 問:console.log(a.x);6 console.log(b.x);
也許有的人看到答案又疑惑的,看了上面的感覺自己掌握了,然后這道題卻有出乎意料之外(⊙﹏⊙)b;
結(jié)果是,不知道有沒有小伙伴答對呢.......
讓我們再來分析一下
1.首先第二行聲明并且使用對象字面量語法創(chuàng)建了一個對象,有屬性n = 1;第三行聲明變量b,并且把a的對象引用賦值給b。所以現(xiàn)在變量b和a指向的是同一個對象,即他們現(xiàn)在共享。
2.第四行問題來了,a.x = a = {n:2}; 先創(chuàng)建一個對象{n:2}并把他的引用送給變量a。因為a.x在執(zhí)行前保留了對{n:1}的引用,所以給原對象增加一個屬性a即對{n:2}的引用
而a現(xiàn)在為{n:2}并沒有x的屬性所以為undefined,而仍然指向原來的引用所以b.x = a;
b.x == a //true
也許講的有點不太清楚,希望你們能說出你們的觀點,也希望自己能對JS理解更深刻
http://www.cnblogs.com/fansama/p/6648956.html