Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过名称获取var的值_Javascript - Fatal编程技术网

Javascript 通过名称获取var的值

Javascript 通过名称获取var的值,javascript,Javascript,我试图通过名称获取var的值: var1='Hello' var2 = getTextFromFirstTextBox() //text in label is "var1" var3 = ${var2} 一切正常,但在这里我应该得到“你好”,但它不工作 var4 = ${var3} 要将value1的值设置为value4,我必须做什么 var1 = 'Hello' var2 = getTextFromFirstTextBox() //text in label is "var1"

我试图通过名称获取var的值:

var1='Hello'

var2 = getTextFromFirstTextBox() //text in label is "var1"

var3 = ${var2}
一切正常,但在这里我应该得到“你好”,但它不工作

var4 = ${var3} 
要将value1的值设置为value4,我必须做什么

var1 = 'Hello'
var2 = getTextFromFirstTextBox() //text in label is "var1"
现在,
var2=“var1”
。如果要将
var1
的值分配给
var3
,可以:

var3 = window[var2];

编辑

有关评论中提出的范围问题,请参见@jledev。

您可以访问全局变量作为
窗口的属性:

> var1='Hello'
"Hello"
> var2='var1'
"var1"
> window[var2]
"Hello"
顺便说一句,这类似于Python——根据您的问题,您似乎期待类似PHP的变量

最好显式创建一个对象来存储所需的内容:

> dict = {} // Create a new Object
Object
> dict['var1'] = 'Hello' // Index it with a string
"Hello"
> dict.var1 // Or directly if you know the name you want
"Hello"
变量是其父对象的属性,全局变量可以作为
窗口
对象的属性处理,因此您可以执行以下操作:

var var1, var2, var3;
function getTextFromFirstTextBox(){
    return "var1";
}
var1 = 'Hello';
var2 = getTextFromFirstTextBox();
var3 = window[var2];
alert(var3); // Shows: Hello

让我们从你的问题中抽出一句话:

var1='Hello'
目前,这将创建一个全局变量(不管代码在哪里)。全局变量是全局对象的属性,在浏览器上是
window
,所以您可以通过带括号的字符串表示法(例如,
window[“var1”]
)来访问它,这里有两个答案。但这只是故事的一部分

如果代码在全局范围内,很明显您正在创建一个全局变量。如果这条线显示为函数中的原样,它仍然会创建一个全局变量-您正沦为函数的牺牲品

这个故事的寓意是:在创建变量时使用
var

var var1 = 'Hello';
现在,您正在当前范围内显式创建一个变量,例如,如果代码在全局范围内,则在全局范围内;如果代码在函数范围内,则在函数范围内

所以全局变量是
窗口的属性
;函数变量呢,它们是对象的属性吗?是的,它们是(在规范中称为“变量对象”,这是一个非常真实的东西,不是规范抽象),但您无法直接访问该对象,也没有可以使用的符号或名称。如果您想使用函数名的字符串版本获取函数变量,您唯一的选择是
eval
,不要这样做。相反,重构代码,使您能够访问对象的属性:

var thingsToLookUp = {
    var1: "Hello",
    var2: "There"
};
alert(thingsToLookUp["var1"]); // alerts "Hello"

不错(+1),但这只适用于全局(窗口范围)变量。当然,这假设
var1
是全局的(它不应该是全局的)。@Sean Patrick Floyd@delnan是的,我没有想到范围:-S@Sarfraz:FTFY,“…这种不正常的特征被称为…”。每当我看到这样的问题时,我嘴里都会有一点呕吐的味道。至少还有改进的余地(还有一些考虑到这一点的答案);-)你对这篇文章有很大的误解或误解。碰巧
是全局范围内的
窗口
,但您不希望依赖它来实现上述功能。后者为+1。每次出现这样的问题,人们都建议
eval
(或者-虽然不是那么糟糕,但仍然是个坏主意-将变量与用户输入的映射混合起来),而不是突出显示真正的解决方案-一个与代码所在的名称空间分离的字典。@TJ该问题不包含上下文,所以很难判断全局变量是否是需要的。我试图澄清属性和变量之间的区别。@jleedev:我只是说,这没关系。当然可以谈论
窗口
,但是如果你把
这个
放进去,你只是把事情弄糊涂了。除了当
这个
=
窗口
时,
变量
s(显式或隐式)永远不会成为
这个
的属性。此外:“如果它是全局定义的或是某个对象的属性”,它显然不是后者,因为它是一个自由符号(前面没有
obj.
)。我认为我们可以安全地假设OP没有使用
,这是唯一一种将其作为对象属性的方法(全局变量除外)。变量没有定义为其父对象/范围的属性。顶级范围很特殊<代码>函数(){var x=…;/*没有eval*/}就无法在此处动态访问x
“变量是其父对象的属性”不,它们不是。恰好
window
是全局范围的“变量对象”(使用规范的术语),但这是您可以直接访问变量对象的唯一位置。在一个函数中,你无法理解它。感谢你的回答,如果只是因为它引发的评论(感谢@pst和@t.J.),因为他们教了我更多关于JS内部的知识。你是对的,我的回答严重错误。我会想一个更准确的文本。@T.J.克劳德嘿,我是第一个来的;-)