2012-08-08 47 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 
} 
相关问题