18

我有变量:

var variableDynamic = 1;
// or    
var variableDynamic = 1 + i++;

有没有办法使用它来创建动态变量名,例如这样的:

var variableName + variableDynamic = {};
// or
var (variableName + variableDynamic) = {};

我知道我上面写的很荒谬,但这是为了解释这个想法。可能吗?


好的,每次用户单击添加新文件组时,我想要创建元素(上传表单),一切正常,除了我使用的插件需要每个上传表单的特殊变量来触发上传按钮(.uploadStoredFiles ();)。

这是我做的粗略代码:

    $('#addOneMoreFileOrGroup').on('click', function(){

    var latestFileUploaderId = parseInt($('.well-large .file-uploader').last().attr('id').split('-')[2]) + 1;

    $('.well-large .control-group:last').after('<div class="control-group deal-type-online">  \
        <label class="control-label">File / File Group Title:</label> \
        <div class="controls"> \
            <input class="span4 file-title" type="text"> \
            <span class="question label label-warning" data-title="File / Group Name:" data-content="Name for your file or group of related files (for example your brand logotype in different file formats)." data-original-title="">?</span> \
            <div id="file-uploader-' + latestFileUploaderId + '" class="file-uploader"></div> \
        </div> \
    </div>');

    var HERE_I_NEED_DYNAMIC_VAR = new qq.FileUploader({
        element: document.getElementById('file-uploader-' + latestFileUploaderId + ''),
        action: 'do-nothing.htm',
        autoUpload: false,
        debug: true,
        uploadButtonText: '<i class="icon icon-plus"></i> Select Files...',
        onSubmit: function() {

            $('#file-uploader-' + latestFileUploaderId + ' .qq-uploader').after('<button id="file-uploader-trigger-' + latestFileUploaderId + '" class="btn btn-primary"><i class="icon-upload icon-white"></i> Upload now</button>');

            $('#file-uploader-trigger-' + latestFileUploaderId + '').on('click', function() {

                if($(this).parent().parent().parent().parent().find('.file-title').val() !== '') {
                    HERE_I_NEED_DYNAMIC_VAR.uploadStoredFiles();
                } else {

                    $(this).parent().parent().parent().addClass('error');

                }

            });

        }
    });

});

}
4

8 回答 8

31

在 JavaScript 中,可以通过obj.prop或访问对象的属性obj['prop']

在全局范围内,所有变量都是window属性的子级。因此,您将能够:

var variableDynamic = 'Test';
window['variableName' + variableDynamic] = 'your value';

看看这个小提琴

但是,如果您想将此变量的范围限制为函数,则必须定义一个父对象并使用 this 代替window.

于 2012-11-08T15:04:36.330 回答
16

您可以使用eval.

eval("dynamic" + i + " = val[i]");

也看看这个:在 JavaScript 中使用动态变量名

于 2012-11-08T15:11:57.453 回答
5

要添加到 FAngels 答案,您可以在任何地方使用括号表示法。这意味着除了使用之外window['var'],您还可以使用this['var'].

于 2015-01-17T23:02:04.230 回答
4

为此,您可以使用eval(). 但却eval()是邪恶的。你应该为这样的事情使用一个数组。

例子:

var i = 1337;
eval('var myvar' + i + ' = \'value\';');

alert(myvar1337);
于 2012-11-08T15:04:07.287 回答
4

我认为eval()不一定是邪恶的——它有时会被滥用。它的工作是获取一个字符串并将其“评估”到 JavaScript 代码 ( MDN ) 中,因此如果确实需要动态设置变量eval()是这样做的一种方法:

var t = 't';
var four = '4';
eval('var ' + (t + four) + ' = "some value";');
console.log(t4);

// returns "some value" to the console

可能有更好的方法来影响动态变量+值对,尤其是因为评估代码字符串是在全局级别实现的,但上述方法确实有效。问题是,它是否是您想要实现的最佳方法(?)。有关“eval()”的讨论,请参阅NCZOnline 的这篇 2013 年博客文章。

于 2015-07-28T13:26:07.610 回答
3

不确定如何在函数范围内完成,但可以像这样创建全局变量:

window[variableName + variableDynamic] = {}
于 2012-11-08T15:04:23.730 回答
0

我不认为您可以在 javascript 中创建动态变量名称,但您可以通过字符串设置对象属性。因此,如果您将动态变量创建为对象的属性,则可以实现您的目标。

于 2012-11-08T15:05:07.343 回答
0

您可以使用 eval 功能

var data = "anyVariableName";
eval("var temp_" + data + "=123;");
alert(temp_anyVariableName);

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

窗户:

var data = "anyVariableName";
window["temp_" + data] = 123;
alert(window["temp_" + data]); //123

或使用点

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({
..
});
于 2021-05-04T18:43:47.280 回答