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

Javascript 为什么当一个变量在另一个变量中使用时,它的值固定在第一个声明中?,javascript,Javascript,在下面的代码中,我希望输出是“text something different”,但它是“text something” 在声明包含变量“thistext”的变量“thistext”后更改变量“dynamic”不会更改“thistext”中的“dynamic”值 我相信这是基本的,但我想我不知道这条规则或避免这种情况的最佳方法 JSFIDLE: 此文本不“包含”变量动态,它包含该变量在表达式求值时的内容。当浏览器编译javascript时,它看起来像 var dynamic = undefine

在下面的代码中,我希望输出是“text something different”,但它是“text something”

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

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

JSFIDLE:


此文本
不“包含”变量
动态
,它包含该变量在表达式求值时的内容。

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

var dynamic = undefined;
 var thisText = undefined;

dynamic = "something";

thistext = "text " + dynamic;

dynamic = "something different";

console.log(thistext);
当您记录值时,您只是记录thisText的值,当dynamic的值为“something”时会填充该值

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


希望这有帮助。

事实上,正如其他人所指出的,这是预期的行为;要执行所需操作,可以使用以下函数:

var dynamic = "something";
var thistext = () => "text " + dynamic;
dynamic = "something different";
console.log(thistext());
注意区别!现在thistext是一个函数,您必须使用
()
调用它,并且每次都会对它求值

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

您没有“在另一个变量中使用一个变量”。您正在表达式中使用变量,表达式的计算结果恰好被分配给另一个变量。当遇到表达式时,将使用其中任何变量的当前值对其进行计算。对于这种行为没有特别的定义,因为它对于JS(以及所有其他命令式/过程式语言)来说是非常基本的

表达式不是计算的动态定义,当输入发生变化时,这些计算会神奇地保持更新,更不用说神奇地更新表达式在过去分配给的变量了。这种计算的动态定义有一个词:它们被称为函数。如果您希望在输入更改时动态地重做某些计算,则将其作为函数写入,并在需要重新计算时调用它,如果您希望(重新)将调用结果(返回值)分配给变量,则执行此操作


是否有一种方法可以在另一个变量中包含对变量的引用,而不是在赋值时包含变量的值

同样,您混淆了变量和表达式,可能还有函数。变量只是一个框,指的是某个值。它不保存何时或如何分配的记录,也不保存用于计算分配给它的值的表达式,也没有任何自动更新自身的方法。作为一个框,变量不能“包含对另一个变量的引用”

避免这种情况的最佳方法


这不是一个需要“避免”的“情况”。这是JavaScript的基本行为。

此文本只计算一次,对
dynamic
的更改不会更新它。对于您想要的结果,您可以在一个方法中添加这行代码,并简单地调用它,使动态变量在该函数的范围内保持可用。有没有办法在另一个变量中包含对变量的引用,而不是在赋值时包含变量的值?有点像回调中“function”和“function()”之间的区别。@jaumel不适用于“普通数据类型”,例如strings@jaumemal最好也在你的主要问题中加入这个评论。好的,有什么规则来管理这种行为?这在javascript中是如何调用的?谢谢。我认为关于你的第一个问题没有任何一般规则。这是“+”运算符的实现方式-例如,您可以查看,并了解在加法/串联之前如何计算左操作数和右操作数。虽然我觉得该语言有点苛刻-它几乎让我为不知道和/或询问而感到羞愧-我会接受这个答案,因为它可能是最清楚的。
var dynamic = "something";
var thistext = () => "text " + dynamic;
dynamic = "something different";
console.log(thistext());