基础知识 - 变量参考

时间:2013-06-16 13:09:55

标签: javascript variables

如果我的术语在这个问题上没有了,请道歉。

采取以下功能:

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的结果值,而不是最初计算此值的实际表达式。

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

2 个答案:

答案 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也会增加,从而产生所需的输出。