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