2014-10-12 43 views
-2

考慮:JavaScript引擎如何創建變量?

var s1 = { 
    a: 1, 
    b: s1.a  
};  

alert(s1.b); // Uncaught TypeError: Cannot read property 'a' of undefined 

任何人都可以揭示JavaScript引擎的爲什麼是這種情況的內部工作燈?

目前我被迫使用:

var s2 = { 
    a: { 
     a: 1 
    }, 
    b: { 
     a: function() { return s2.a.a} 
    } 
}; 

alert(s2.b.a()); // 1 
+4

這有沒有關係如何「引擎創建變量」。而只是語言如何工作。在這種情況下,不重要的是,在右邊表達式被評估之後,對變量的賦值只發生**。 (除非's1'已經被賦值,否則這將導致不同的錯誤。在新的控制檯中再次運行它以追蹤「核心」問題。) – user2864740 2014-10-12 09:58:59

+0

關鍵部分是對象字面值 - 表達式右首先將分配標誌評估爲整體。它非常有意義;根據定義,對象文字是原子結構。 – raina77ow 2014-10-12 10:01:16

+0

這個問題在SO中被問過幾十次,無論是這個變體還是'b:this.a'變體。 – 2014-10-12 12:12:10

回答

1

這裏面聲明:

var s1 = { 
    a: 1, 
    b: s1.a  
}; 

s1還沒有定義,直到數據聲明的結尾,因此它不能被稱爲在數據聲明中。這正是Javascript的工作原理。

你可能只是這樣做,而不是:

var s1 = { a: 1 }; 
s1.b = s1.a;