Das erste verstehe ich eigentlich nicht.
var y = {x: 50};
ergibt ein Objekt, abervar y = eval '{x: 50}';
ergibt 50. Das ist wohl das was Timo bereits gesagt hatte und x ist hier nur ein Label.
Wieso verstehst du das nich? Ist doch logisch: Im Kontext von var blub = ...; wird eine Expression erwartet, daher ist {...} an der Stelle nie ein Block, sondern immer ein Object Literal. Aber eval() führt auch Statements aus und gibt das Ergebnis des letzten Expression Statements zurück. Wenn ich einfach
{
bla :
5
}
in mein Script schreibe ohne Kontext, dann ist es natürlich ein Block. Das sieht auch eval so. Wenn der Kontext aber (...) ist, also eine Expression, dann sieht eval es ebenfalls als Object Literal an.
Mathias