摘要:先說下這個老話題連續賦值例結果是什么這句簡單,而這句呢答案是,變成了全局變量了這是實際執行順序未使用聲明,所以變全局變量了例很早以前的面試題目了,相信很多人知道答案,考點詞法分析執行順序運算符優先級等這是我理解的實際執行順序我是這么猜想的自
先說下這個老話題:連續賦值
例1:
function a(){ var o1 = o2 = 5; } a(); console.log(o1); console.log(o2);
結果是什么?console.log(o1);這句簡單undefined,而console.log(o2);這句呢?答案是5,o2變成了全局變量了
這是實際執行順序:
var o1; o2 = 5; //o2未使用var聲明,所以變全局變量了 o1 = o2;
例2:
var foo = {n:1}; var bar = foo; foo.x = foo = {n:2}; console.log(foo.x); console.log(bar.x);
很早以前的面試題目了,相信很多人知道答案,考點:詞法分析、執行順序、運算符優先級等
這是我理解的實際執行順序:
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}
執行順序:
先為foo添加x屬性,未賦值(undefined),這里的foo還是{n:1}
遇到第一個"=",準備為x賦值
"="優先級最低,先計算右邊表達式的值
執行foo = {n:2},并將該賦值表達式的結果值{n:2}賦值給之前的foo.x
最終foo的引用指向了{n:2},不存在屬性x
而bar的引用沒變,始終指向原來的{n:1},而{n:1}被添加了x屬性{n:2}變為{n:1,x:{n:2}},這就是最后bar引用的值
JS 解析器在執行語句前會將函數聲明和變量定義進行"預編譯",而這個"預編譯",并非一個頁面一個頁面地"預編譯",而是一段一段地預編譯,所謂的段就是一 個