摘要:先說下這個老話題連續(xù)賦值例結(jié)果是什么這句簡單,而這句呢答案是,變成了全局變量了這是實際執(zhí)行順序未使用聲明,所以變?nèi)肿兞苛死茉缫郧暗拿嬖囶}目了,相信很多人知道答案,考點詞法分析執(zhí)行順序運算符優(yōu)先級等這是我理解的實際執(zhí)行順序我是這么猜想的自
先說下這個老話題:連續(xù)賦值
例1:
function a(){ var o1 = o2 = 5; } a(); console.log(o1); console.log(o2);
結(jié)果是什么?console.log(o1);這句簡單undefined,而console.log(o2);這句呢?答案是5,o2變成了全局變量了
這是實際執(zhí)行順序:
var o1; o2 = 5; //o2未使用var聲明,所以變?nèi)肿兞苛? o1 = o2;
例2:
var foo = {n:1}; var bar = foo; foo.x = foo = {n:2}; console.log(foo.x); console.log(bar.x);
很早以前的面試題目了,相信很多人知道答案,考點:詞法分析、執(zhí)行順序、運算符優(yōu)先級等
這是我理解的實際執(zhí)行順序:
var foo; var bar; foo = {n:1}; bar = foo; //bar = {n:1} foo.x = undefined; // foo.x = (foo = {n:2}); console.log(foo.x); //undefined console.log(bar.x); //{ n: 2 }
我是這么猜想的:自我感覺勉強說的通,有不對的地方請指出!
JS引擎遇到foo.x = foo = {n:2}; 詞法分析為foo.x, =, foo, =, {n:2}
執(zhí)行順序:
先為foo添加x屬性,未賦值(undefined),這里的foo還是{n:1}
遇到第一個"=",準備為x賦值
"="優(yōu)先級最低,先計算右邊表達式的值
執(zhí)行foo = {n:2},并將該賦值表達式的結(jié)果值{n:2}賦值給之前的foo.x
最終foo的引用指向了{n:2},不存在屬性x
而bar的引用沒變,始終指向原來的{n:1},而{n:1}被添加了x屬性{n:2}變?yōu)?b>{n:1,x:{n:2}},這就是最后bar引用的值
JS 解析器在執(zhí)行語句前會將函數(shù)聲明和變量定義進行"預(yù)編譯",而這個"預(yù)編譯",并非一個頁面一個頁面地"預(yù)編譯",而是一段一段地預(yù)編譯,所謂的段就是一 個