var a = {
x : 3,
y : 9,
z : a.y + 1;
}
alert( a.z );
错误提示: cannot read property of "y" of undefined;
为什么?
原因楼上已经说了,
换成this.a.y + 1
var a={}; 这种方式是对象常量,对象的属性会立即计算执行,在堆中开辟一个内存存放,然后a这个变量指向这个内存。这就是你在a属性中引用别的属性报错的原因,因为a这时还是undefined。有人建议使用在a属性中使用this,是希望this指向的是a,但实际不是,应该是window或global。
解决方式 分开计算 a.c=a.b+4
改为函数 a.c= function(){return this.b+4}
var a = {
x:3,
y:9,
z:a.y + 1
};
表达式赋值先计算赋值操作符右边的值,然后把右边的计算结果赋值给左边的变量
左边的变量在没有被赋值前,其值为undefined
所以在{}
对象字面量表达式执行完之前,a的值一直为undefined
故JS解释器会提示如上的错误信息给你
那么修改为
var a = {
x:3,
y:9,
z:this.y + 1
};
代码运行没有错误,那么a.z是期望的10么?
console.log(a.z);
很不幸,给出的值是NaN
,原因在于此处的this代表的是全局对象,而不是期望的变量a指向的对象,全局对象下没有y这个属性,this.y值为undefiend,和1执行加操作后,其值就为NaN
想要在字面量表达式中使用当前构建的对象的属性值是不能达成的
不过可以试试这样的~
var a=new function(){
this.x=3;
this.y=9;
this.z=this.y+1;
};
一定要这么写可以考虑用闭包
a.y + 1
是在变量a
声明过程中用到的计算表达式,但既然说了,这个时候a
还在声明阶段,那当然是undefined
了,换成this.y + 1
吧