在下面的代码中,我希望输出为“text something something”,而不是“text something”。
var dynamic = "something";
var thistext = "text " + dynamic;
dynamic = "something different";
console.log(thistext);
在声明包含它的变量“thistext”之后更改变量“dynamic”不会更改“thistext”中“dynamic”的值。
我确信这是基本的,但我认为我不知道这条规则或避免这种情况的最佳方法。
Jsfiddle:
答案 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的值为""。
时,会填充该值。如果在更改动态值后执行相同的操作,您将看到所需的结果。
希望这有帮助。