js連等賦值的陷阱
阿新 • • 發佈:2018-07-17
console 函數 所有 理解 strong 建議 spa 提前 ()
先來看一段代碼:
(function(){ var x = y = 1; })(); console.log(y); console.log(x);
最開始我覺得這道題簡直是送分題啊,很明顯結果為,y=1;x=1
然後當我在控制臺輸出以後,感覺一記響亮的耳光,輸出結果:
結論:上面的結果是因為變量提升和連等賦值造成的。
分析:上面的 var x=y=1 容易理解為var x=y,var y=1; 因為這裏使用了連等賦值,連等操作符賦值是從右向左的,相當於 y=1; var x =y;
然後又因為變量提升,會把所有聲明提前(只是聲明提前,賦值不提前) 到函數體頂部,var x=y=1,實際相當於,var a; y=1; var x=y;
所以上面代碼console.log(y)的值為1,因為y=1沒有用var在函數體內部聲明,所以不是局部變量,是全局變量。
註:① 沒有用var聲明的變量都是全局變量;② 用var聲明了變量,但在函數體外,沒有在函數體內的也是全局變量
③ 在函數體內,但沒有用var聲明的變量也是全局變量;④ 在函數體內,並用var聲明的變量才是局部變量
⑤ 變量提升只是聲明提前到函數體頂部,賦值不會提前
可能你會問,那上面console.log(x)為什麽不是輸出undefined,而是報錯呢?
調用在該作用域未聲明的變量,是會報錯的。而一個變量只聲明,但未定義賦值的時候,才會是undefined。這裏變量x在全局作用域未曾聲明,並不存在,所以會報錯!
所以綜上述,建議大家還是盡量不要用連等賦值,會有很多隱患
js連等賦值的陷阱