2012-08-08 54 views
-2

我想知道如果這些依賴未定義行爲,和/或如果他們能夠適應,使他們不這樣做:我可以信任JavaScript中的聲明執行順序嗎?

例1

var str = { 
    ver: '1.01', 
    verdesc: 'WIP', 
    composite: { 
    version_block: str.ver + str.verdesc 
    } 
} 

例2

var str = { 
    ver: '1.01', 
    verdesc: 'WIP', 
}, 
composite: { 
    version_block: str.ver + str.verdesc 
}; 
+5

您還沒有甚至試圖執行該代碼...': - /' – 2012-08-08 01:41:59

+0

同意煤泥,downvoting因爲你可以在1秒內 – 2012-08-08 01:46:59

+0

已經驗證了這一點。如果代碼運行或不運行時,它並不告訴我它是否是未定義的行爲。在某些語言中,評估表達式的順序可能因實現而異。 – 2012-08-08 01:47:48

回答

2

您正在嘗試引用通過對象字面量從對象字面量本身定義的屬性。這不可能。在之後,屬性被分配到str變量,整個對象文字被評估。因此,在對象字面上,您不能引用str的屬性。

所以,當您分配一個對象文本變量,

var obj = { ... }; 

那麼,對象文本里面,你不能使用obj參考的。在對象字面被評估的時間,obj仍然undefined,只有對象文字已經完全解析和評估,創建相應的對象值,並分配給obj

var obj = { 
    a: 123, 
    b: obj.a // this will throw, "obj" is undefined 
}; 
obj.b = obj.a; // this works 
1

http://jsfiddle.net/kendfrey/XwVFt/

錯誤消息解釋這一切。

你不能那樣做。變量的屬性在變量被賦值之前是不可訪問的,之後整個對象被創建。

您可以通過分配對象,然後然後設置其屬性來解決此問題。

var str = { }; 
str.ver = '1.01'; 
str.verdesc = 'WIP'; 
str.composite = { 
    version_block: str.ver + str.verdesc 
}