1. 程式人生 > >js連等賦值的陷阱

js連等賦值的陷阱

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連等賦值的陷阱