我有一个名为totalRevenue的对象,负责按月存储公司的累计收入。
var totalRevenue = {
jan : 147,
feb : 290,
mar : 400
};
并非所有月份名称都出现在totalRevenue
对象&它们是在填充/估计各自的值时动态创建的。
在每个月的月初,我们使用算法估算该月的收入。 ......这样:
with(totalRevenue){
mar = mar - feb; // here we calculate pure mar revenue
feb = feb - jan; // here we calculate pure feb revenue
apr = mar - feb; // this is part one of the algo.
}
(我正在使用with
构造来避免重复。)
现在我正在使用totalRevenue.apr
进行其余的算法计算。但经过一些挑战,我得到了totalRevenue.apr = undefined
!!
有谁知道为什么?!正如我所料,它的值等于mar - feb
。
答案 0 :(得分:1)
如果apr
不是totalRevenue
的属性,则with
不会将其置于范围内,您的代码将创建一个名为apr
的新全局。解释器无法知道给定名称是指一个全局,还是打算引用最近的with
块的一个迄今未定义的属性,因此假设它是全局的。您可以确保totalRevenue
每个月都有一个属性,或者完全避免使用with语句。不鼓励使用with
MDN这样说:
不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。有关详细信息,请参阅下面“说明”部分中的“歧义对比”段落。