先看問題,如下,自己執行一下吧!
if (!('_qyzA' in window)) { var _qyzA = 1; } alert(_qyzA);//undefined
分析:首先,所有的全域性變數都是window的屬性,如var _qyzA = 1;等價於window._qyzA = 1;
其次,所有的變數的宣告都在作用域的頂部,如alert("_qyzA"); var _qyzA;
相當於var _qyzA;alert("_qyzA");這是由於JavaScript引擎首先會掃描所有的變數宣告,然後將這些變數宣告都移動到頂部。
最後,雖然變數宣告被提前了,但變數並沒有賦值,因為這行程式碼包括了變數宣告和變數賦值。當變數宣告和變數賦值在一起用的時候,
JavaScript引擎會自動將其分為兩部分,以便將變數宣告提前,不將賦值提前是因為其有可能會影響程式碼執行時發生不可預期的結果。
故原始碼相當於:
var _qyzA; if (!('_qyzA' in window)) { _qyzA = 1; } alert(_qyzA); //undefined