1

抱歉,如果我的术语在这个问题上不正确。

采取以下功能:

i = 1;
v = i * 2;

for (j = 0; j < 4; j++ ) {
    console.log(v);
    i++;
    }

控制台将返回 2、2、2、2。当我遇到这种情况时,我将变量“v”移动到 for 循环中,它返回预期值 2、4、6、8。我对变量工作方式的理解从根本上说显然是错误的。

我的逻辑告诉我,变量 v 的值与变量 i 的值永久相关。因此,每次引用 v 时,也必须引用 i 的值。因为 i 会在数值上增加,所以 v 应该与此成比例增加。相反,似乎存储了 v 的结果值,而不是最初计算该值的实际表达式。

这是第一个原则问题,虽然我设法找到了解决该问题的方法,但我不明白为什么该解决方案有效。

4

2 回答 2

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++;
}
于 2013-06-16T13:14:14.907 回答
2

是的,变量只会存储分配给它们的实际值,而不是创建该值的逻辑。

所以这行代码:

v = 2 * i;

将计算2 * i然后创建一个v指向计算结果的变量。因此,这应该可以解释为什么您的第一个示例无法按预期方式工作。

在第二个示例中,您将该语句放在 for 循环中:

for (...) {
    v = 2 * i;
    i++;
}

现在,v将在每次迭代中重新分配,并且2 * i每次都会重新评估表达式。并且由于i在每次迭代中v都会增加,因此也会增加,从而产生所需的输出。

于 2013-06-16T13:41:34.237 回答