如果我的术语在这个问题上没有了,请道歉。
采取以下功能:
i = 1;
v = i * 2;
for (j = 0; j < 4; j++ ) {
console.log(v);
i++;
}
控制台将返回2,2,2,2。当我遇到这个时,我在for循环中移动了变量“v”,它返回了预期值2,4,6,8。我对方式的理解变量在基础层面上工作显然是错误的。
我的逻辑告诉我,变量v的值与变量i的值永久相关。因此,每次参考v时,还必须参考i的值。由于我将在数值上增加,然后v应该与此成比例地增加。相反,似乎存储了v的结果值,而不是最初计算此值的实际表达式。
这是第一个原则问题,虽然我设法找到问题的解决方案,但我不明白为什么这个解决方案有效。
答案 0 :(得分:2)
第一种方式
i = 1;
// v is equal to the result of "i * 2" (2) and will stay that way
// until it (v) is set to another value (which never happens)
v = i * 2;
for (j = 0; j < 4; j++ ) {
console.log(v);
i++;
}
第二路
i = 1;
for (j = 0; j < 4; j++ ) {
// v is equal to i*2, we are setting v each iteration. in each iteration, i is
// changed. so the value of v will be different
v = i * 2;
console.log(v);
i++;
}
如果由于某种原因你不希望每次在循环中明确设置v
,你可以创建一个函数:
i = 1;
v = function(){ return i * 2 };
for (j = 0; j < 4; j++ ) {
console.log(v());
i++;
}
答案 1 :(得分:2)
是的,变量只会存储分配给它们的实际值,而不是存储创建该值的逻辑。
所以这行代码:
v = 2 * i;
将计算2 * i
,然后创建一个变量v
,指向计算结果。所以,这应该可以解释为什么你的第一个例子不按照预期的方式工作。
在第二个例子中,你将该陈述放在for循环中:
for (...) {
v = 2 * i;
i++;
}
现在,v
将在每次迭代中重新分配,并且每次都会重新评估表达式2 * i
。由于i
在每次迭代中都会增加,v
也会增加,从而产生所需的输出。