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

Why when a variable is used within another variable, its value its fixed to first declaration?

本文关键字:变量 声明 第一次 一个 另一个 为什么      更新时间:2023-09-26

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

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

在声明了包含该变量的" thisttext "变量后,更改"dynamic"变量,不会改变" thisttext "中"dynamic"的值。

我相信这是一些基本的东西,但是我想我不知道这条规则,也不知道避免这种情况的最好方法。

Jsfiddle:

https://jsfiddle.net/k5wwpvgt/

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

你没有"在另一个变量中使用一个变量"。在表达式中使用变量,其计算结果恰好被赋值给另一个变量。当表达式遇到时,使用当前中任何变量的值对求值。没有专门的词来描述这种行为,因为它是JS(以及所有其他命令式/过程式语言)的基础。

表达式不是计算的动态定义,当输入发生变化时,它会神奇地保持更新,更不用说神奇地更新过去碰巧赋值给表达式的变量了。这种计算的动态定义有一个词:它们被称为函数。如果您希望在输入改变时动态地重新完成某些计算,那么将其编写为函数,并在需要重新计算时调用它,如果您希望(重新)将调用的结果(return值)赋值给变量,那么就这样做。

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

再次,你混淆了变量和表达式,可能还有函数。变量只是一个指向某个值的方框。它没有保存何时或如何赋值的记录,也没有使用什么表达式来计算赋给它的值,也没有任何自动更新自身的方法。作为一个方框,变量不能"包含对另一个变量的引用"。

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

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

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

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

注意差异!现在这个文本是一个函数,你必须用()调用它,它每次都被计算。

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

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

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

当你记录值时,你只是记录了thisText的值,当dynamic的值是"something"时,它被填充。

如果你在改变动态值后做同样的操作,你会看到你想要的结果。