我有变量:
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');
}
});
}
});
});
}
答案 0 :(得分:29)
在JavaScript中,可以通过obj.prop
或obj['prop']
访问对象的属性。
在全局范围内,所有变量都是window
属性的子项。所以你将能够做到:
var variableDynamic = 'Test';
window['variableName' + variableDynamic] = 'your value';
查看this fiddle。
但是,如果您想将此变量的范围限制为函数,则必须定义父对象并使用它来代替window
。
答案 1 :(得分:16)
答案 2 :(得分:4)
为此,您可以使用eval()
。但eval()
是邪恶的。你应该使用数组来做这样的事情。
示例:
var i = 1337;
eval('var myvar' + i + ' = \'value\';');
alert(myvar1337);
答案 3 :(得分:4)
要添加到FAngels答案,您可以在任何地方使用括号表示法。这意味着除了使用window['var']
之外,您还可以使用this['var']
。
答案 4 :(得分:4)
我认为eval()
不一定是邪恶的 - 它有时会被误用。它的工作是将一个字符串和“ eval uate”加入JavaScript代码(MDN),所以 iff 你需要动态设置变量{{1这是一种方法:
eval()
可能有更好的方法来实现动态变量+值对,尤其是因为 eval uated代码字符串是在全局级别实现的,但上述方法确实有效。问题是,它是你想要实现的最佳方法(?)。有关`eval()'的讨论,请参阅this 2013 blog post from NCZOnline。
答案 5 :(得分:3)
不确定如何在函数范围内完成,但可以像这样创建全局变量:
window[variableName + variableDynamic] = {}
答案 6 :(得分:1)
我认为您不能在javascript中创建动态变量名,但您可以按字符串设置对象属性。因此,如果您将动态变量创建为对象的属性,则可以实现目标。
答案 7 :(得分: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({
..
});