Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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中的变量_Javascript_Variables_Variable Variables - Fatal编程技术网

&引用;变量";JavaScript中的变量

&引用;变量";JavaScript中的变量,javascript,variables,variable-variables,Javascript,Variables,Variable Variables,我知道在PHP中可能有“变量”变量。比如说, $x=“变量”; $$x=“你好,世界!”; echo$variable;//显示“你好,世界!” 在JavaScript中是否可以将变量名称作为字符串引用?怎么做?如果您非常想这样做,您可以尝试使用eval(): 或使用窗口对象: var data = "testVariable"; window["temp_" + data] = 123; alert(window["temp_" +

我知道在PHP中可能有“变量”变量。比如说,

$x=“变量”;
$$x=“你好,世界!”;
echo$variable;//显示“你好,世界!”

在JavaScript中是否可以将变量名称作为字符串引用?怎么做?

如果您非常想这样做,您可以尝试使用eval():

或使用窗口对象:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);
tl;医生:

对于这一点,没有单一的解决方案。可以通过
窗口
动态访问某些全局变量,但这不适用于函数的局部变量。未成为
window
属性的全局变量是使用
let
const
以及
class
es定义的变量

几乎总有比使用变量更好的解决方案相反,您应该查看并为您的问题选择正确的解决方案

如果您有一组固定的名称,例如

//不好-不要这样做!!!
var-foo=42;
var-bar=21;
var key='foo';

控制台日志(eval(key))当然可以,但不能。变量必须是全局的

var killingFunction='alert'
var killMeNow='请'
var please='你被杀了!'

此[killingFunction](此[killMeNow])
要在JavaScript中仅使用字符串引用变量,可以使用

window['your_variable_name']

您可以设置和引用变量以及变量中的对象。

您可以使用JavaScript函数

此函数将提供的字符串转换为JavaScript代码,然后执行它

例如:

eval("console.log('Hello, World!')"); // Logs hello world
因此,要将其用作变量,可以执行以下操作:

var a = "Hello,";
var hello = "World!";
console.log(a + " " + eval(a)); // Logs hello world
这将产生与以下内容完全相同的输出:

console.log(a + " " + hello); // Logs hello world

(示例取自。)

与PHP不同,JavaScript不提供对globals数组的访问(该数组包含对当前声明的所有变量名的引用)。因此,JavaScript不提供对变量的本机支持。但是,只要将所有变量定义为数组或对象的一部分,就可以模拟此功能。这将为您创建一个全局数组。例如,不要像下面这样在全局范围中声明变量
hello

var hello = 'Hello, World!';
让我们把它封装在一个对象中。我们将该对象称为
vv
(变量):

现在我们可以通过变量的索引来引用该变量,因为可以使用变量提供数组索引,所以我们实际上是在使用变量:

console.log(vv[referToHello]); //Output: Hello, World!
您问题的答案

让我们将此应用于您在原始问题中提供的代码:

    var vv = {
        'x': 'variable',
        'variable': 'Hello, World!'
    };
    console.log(vv[vv['x']]); // Displays "Hello, World!"
实用

虽然前面的代码可能看起来非常麻烦和不切实际,但在JavaScript中使用这种封装类型的变量还是有实际用途的。在下面的示例中,我们使用相同的概念来获取未定义数量的HTML元素的ID

var elementIds = [],
        elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
        elements.forEach( (element) => {
            elementIds[element] = document.getElementById(element);
        });
此示例基于每个元素的ID声明变量(元素ID中的键),并将所述元素的节点指定为每个变量的值。由于在JavaScript中使用全局变量通常是不鼓励的,因此给变量一个唯一的作用域(在本例中,在
elementId
数组中声明它们)不仅简洁,而且更负责任。

您可以使用全局
窗口
对象,或者
this

窗口

var data = "anyVariableName";
window["temp_" + data] = 123;
alert(window["temp_" + data]); //123
或使用dot:

var data = "anyVariableName";
window.data = 123;
alert(window.data); //123
这:

还是用圆点

var data = "anyVariableName";
this.data = 123;
alert(this.data); //123
一个真实的例子:

var tasksTableNameRandom = 'tasksTable_' + Math.random().toString(36).substr(2, 5);
console.log('Tasks Table Object name: ' + tasksTableNameRandom);
this.tasksTableNameRandom = $('#tasks-data-table').DataTable({
    ...
});

eval
无法在严格模式下创建局部变量。间接调用可以创建全局变量,但数组不是变量,如果将数组用作函数参数,JS解释器将使用指向数组的指针。在编程中,某些术语的使用是精确的,而您所要求的对于定义多个值只有很少意义的示例:var x=1;变量x,y=2;x=1;变量x=1,y=2;var x=xx=1;变量y=x+x;2021年,
eval
在这方面变得毫无用处;至少在实际应用中是这样。即使您的CSP允许
eval
,我也不知道有哪种生产代码没有通过某个缩微器运行,这会弄乱您的变量名。但只有在web浏览器(?)中运行时才可以。Node.js呢?
var data = "anyVariableName";
window.data = 123;
alert(window.data); //123
ar data = "anyVariableName";
this["temp_" + data] = 123;
alert(this["temp_" + data]); //123
var data = "anyVariableName";
this.data = 123;
alert(this.data); //123
var tasksTableNameRandom = 'tasksTable_' + Math.random().toString(36).substr(2, 5);
console.log('Tasks Table Object name: ' + tasksTableNameRandom);
this.tasksTableNameRandom = $('#tasks-data-table').DataTable({
    ...
});