为什么当一个变量在另一个变量中使用时,它的值固定为第一次声明
Why when a variable is used within another variable, its value its fixed to first declaration?
在下面的代码中,我希望输出是"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"时,它被填充。
如果你在改变动态值后做同样的操作,你会看到你想要的结果。
- 使用同一对象中的其他变量声明变量
- 如何将变量声明为全局变量
- 如何将变量声明为全局变量?用case foreach?Javascript
- 理解bootstrap.js变量声明
- 将 Javascript 变量声明为 PHP 形式
- 单个逗号分隔的变量声明和多个声明之间的区别是什么
- Do变量声明初始化函数
- Javascript变量声明:什么是“;var myVariable={}”;
- javascript中不同类型的变量声明
- 为什么在循环的Javascript中包含变量声明
- for 循环中必需的变量声明
- JavaScript 中的变量声明
- 在 Javascript 变量声明中使用逗号
- 你能在变量声明中添加条件吗?
- JavaScript 全局变量声明
- 节点.js变量声明和作用域
- 具有多个逗号分隔值的变量声明是什么意思(例如 var a = b,c,d;)
- 移动图像 ..JavaScript 将变量声明为字符串
- 让 javascript 将(默认情况下)未声明的变量声明到当前本地范围(基于首次使用)而不是全局范围
- 循环中的变量声明