为什么在另一个变量中使用变量时,它的值是否固定为第一个声明?

时间:2016-11-16 00:54:58

标签: javascript

在下面的代码中,我希望输出为“text something something”,而不是“text something”。

var dynamic = "something";

var thistext = "text " + dynamic;

dynamic = "something different";

console.log(thistext);

在声明包含它的变量“thistext”之后更改变量“dynamic”不会更改“thistext”中“dynamic”的值。

我确信这是基本的,但我认为我不知道这条规则或避免这种情况的最佳方法。

Jsfiddle:

https://jsfiddle.net/k5wwpvgt/

4 个答案:

答案 0 :(得分:1)

事实上,正如其他人指出的那样,这是预期的行为;要做你想做的事,你可以使用一个函数:

var dynamic = "something";
var thistext = () => "text " + dynamic;
dynamic = "something different";
console.log(thistext());

注意差异!现在这个文本是一个函数,你必须用()来调用它,并且每次都会对它进行评估。

答案 1 :(得分:1)

  

为什么在另一个变量中使用变量时,其值固定为第一个声明?

你不是"在另一个变量中使用变量"。您在表达式中使用变量,其评估结果恰好被分配给另一个变量。表达式在遇到时会被评估,其中包含任何变量的当前值。这种行为没有特别的说法,因为它对JS(以及所有其他命令/程序语言)来说都是如此基础。

表达式不是计算的动态定义,当输入发生变化时,它们会神奇地保持更新,更不用说神奇地更新过去曾经分配过表达式的变量。这种动态的计算定义有一个词:它们被称为函数。如果您希望在输入更改时动态重做某些计算,则将其写为函数并在需要重新计算时调用它,并且如果要(重新)分配调用的结果({{1} } value)变量,然后这样做。

  

是否有办法在另一个变量中包含对变量的引用,而不是在评估赋值时包含变量的值?

同样,你会混淆变量和表达式以及可能的功能。变量只是一个框,指的是一些值。它没有记录何时或如何分配它,或者使用什么表达式来计算分配给它的值,也没有任何自动更新的方法。作为一个盒子,变量不能包含对另一个变量的引用"。

  

避免这种情况的最佳方法。

这不是"情况"要避免"避免"。这是JavaScript的基本行为。

答案 2 :(得分:0)

thistext不包含""变量dynamic,它包含该变量的内容,因为它是在评估表达式时的

答案 3 :(得分:0)

当浏览器编译你的javascript时,它看起来像

var dynamic = undefined;
 var thisText = undefined;

dynamic = "something";

thistext = "text " + dynamic;

dynamic = "something different";

console.log(thistext);

当您记录该值时,您只记录thisText的值,当dynamic的值为""。

时,会填充该值。

如果在更改动态值后执行相同的操作,您将看到所需的结果。

希望这有帮助。