#javascript #string #save #var
#javascript #строка #Сохранить #var
Вопрос:
Я пытаюсь создавать переменные, используя строки.
Я пишу скрипт, который будет загружать изображения из массива строк, и я хочу сохранить эти изображения в переменных с именем используемой строки.
Пока это код:
var images = ["CrazyWolf.jpg", "CrazyWolf.jpg", "CrazyWolf.jpg", "CrazyWolf.jpg"];
var name = "";
function preload(path)
{
img = new Image();
img.src = path;
img.onload = imageLoaded;
return img;
};
function makeImages()
{
for(var i = images.length; i > 0; i--)
{
source = images.shift();
preload(source);
var name = source.replace(".jpg", "Image");
console.log(name);
//make vars with as name, var name
//Console.log(name); returns: CrazyWolfImage
if(i==0) console.log("Loop ended");
}
}
Как мне использовать это имя для создания переменных из него?
Любая помощь была бы высоко оценена!
Спасибо!
Комментарии:
1. @Vickel: Что вы имеете в виду? Параметр
path
определен именно в этом коде. Какое еще определение было бы необходимо?
Ответ №1:
То, что вы просите, довольно просто. Вы можете сохранить изображение как свойство в window
объекте, и к нему можно получить доступ как к глобальной переменной:
function makeImages() {
while (images.length) {
source = images.shift();
var name = source.replace(".jpg", "Image");
window[name] = preload(source);
}
}
Однако динамическое создание переменных не очень полезно, и это может иметь непредвиденные побочные эффекты. Код, использующий переменные, должен либо слепо использовать некоторые переменные в зависимости от их создания, либо обращаться к ним динамически, что делает бессмысленным использование их в качестве переменных в первую очередь. Глобальное пространство имен уже заполнено идентификаторами, поэтому существует риск того, что вы используете имя, которое уже существует.
Вместо использования глобального пространства имен создайте объект, в котором вы храните изображения по имени. Таким образом, они изолированы от глобального пространства имен и его существующих идентификаторов. Вам даже не нужно манипулировать именем, чтобы создать допустимый идентификатор, имя типа CrazyWolf.jpg
отлично подходит для доступа к свойствам:
var img = {};
function makeImages() {
while (images.length) {
source = images.shift();
img[source] = preload(source);
}
}
Теперь вы можете получить доступ к изображениям динамически из объекта. Пример:
document.getElementById('#ShowImage').src = img['CrazyWolf.jpg'].src;
Вы также можете перебирать изображения в объекте, что было бы невозможно, если бы они были переменными среди всех существующих в глобальном пространстве имен:
for (image in img) {
image.style.width = '200px';
}
Примечание: При циклическом просмотре свойств объекта вы не можете полагаться на порядок их обработки. Вы бы использовали массив вместо объекта, если хотите сохранить определенный порядок.
Ответ №2:
вы можете сказать что-то вроде этого:-
eval("var number = 5");
console.log(number);
Это будет напечатано 5
как ответ.
Я думаю, это будет полезно.
Ответ №3:
Вы не можете создавать неглобальные переменные с сконструированными именами без использования eval()
(что было бы довольно плохой идеей), но вы можете создавать свойства объекта:
var imgs = {};
for(var i = images.length; i > 0; i--)
{
source = images.shift();
preload(source);
var name = source.replace(".jpg", "Image");
console.log(name);
imgs[name] = whatever;
}
eval()
следует избегать, поскольку это делает внутреннюю оптимизацию кода невозможной, если не по часто обсуждаемым эстетическим причинам.
Глобальные переменные — это свойства глобального контекста ( window
), поэтому, если вам нужны глобальные переменные (почему?) вы можете использовать это вместо локального объекта.
Комментарии:
1. если мой ответ будет иметь какие-то ужасные побочные эффекты, дайте мне знать, я удалю это.
2. @Mritunjay ну, просто это
eval()
делает невозможным для современных систем JavaScript применение оптимизации к коду. Это не всегда так плохо, ноeval()
почти всегда можно избежать.