Как сохранить код JavaScript простым и организованным с помощью длинных списков аргументов?
Я прошу прощения, если мое использование терминологии является неточным. Я новичок.
У меня есть длинный список переменных, которые разделяются / используются функцией loop(). В настоящее время я вызываю только loop () дважды и передаю только уникальные аргументы для ссылки на звуковой файл. Я собираюсь увеличить этот код так, чтобы у меня было много вызовов loop (), но каждый из них имел уникальный набор аргументов, заменяющих мой длинный общий список переменных. Я думаю, что будет немного запутанно и запутанно иметь длинный список уникальных аргументов для каждого вызова loop(). Есть ли способ, чтобы я мог сохранять вещи читаемыми и организованными, создавая различные списки переменных, к которым могут обращаться только параметры для определенного вызова loop()? Примерно такой псевдокод:
argumentListA {
var sound = 'audio/sample.mp3'
var aStartMin = 2
var aStartMax = 200
var seekMin = .5
var seekMax = 2
}
argumentListB {
var sound = 'audio/sampleB.mp3'
var aStartMin = 0
var aStartMax = 100
var seekMin = 0
var seekMax = 1
}
loop(argumentListA);
loop(argumentListB);
Мне бы хотелось иметь возможность определять все эти переменные / параметры в одном месте, а затем просто вызывать их с помощью вызова функции.
Обновленный рабочий код ниже:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="js/howler.core.js"></script>
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<script>
var options = {
soundFileName: 'audio/sample.mp3',
aStartMin: 0,
aStartMax: 100,
probablilityAMin: 0,
probablilityAMax: 10,
probabilityThreshold: 3,
seekMin: 0,
seekMax: 1,
aFadeIn: 9000,
aFadeOut: 3000,
aPlayDurationMin: 5000,
aPlayDurationMax: 11000,
maxVolume: 1,
numberOfSounds: 0, // starting variable at 0
maxNumberOfSounds: 2
};
function logNumberOfSounds() { // passing options into this before is what broke code
options.numberOfSounds++;
console.log('Number of sounds is now: ' + options.numberOfSounds);
}
// calls the soundSorter function repeatedly so sounds will play
(function masterClock(options) {
setTimeout(function () {
soundSorter();
masterClock();
}, 2000);
}());
function soundSorter() { // passing options into this before is what broke code
var probabilityResult = Math.floor((Math.random() * options.probablilityAMax) + options.probablilityAMin);
if (probabilityResult > options.probabilityThreshold) {
loop(options);
}
else {
loop(options);
}
}
function loop(options) {
setTimeout(function () {
var playDuration = Math.floor((Math.random() * options.aPlayDurationMax) + options.aPlayDurationMin);
setTimeout(function () {
if (options.numberOfSounds < options.maxNumberOfSounds) { //Don't create more than the max number of sounds.
var sound = getSound(options.soundFileName);
var id2 = sound.play();
logNumberOfSounds();
console.log('probabilityThreshold is now: ' + options.probabilityThreshold);
//sound.volume(0); // don't think I need this since it's defined next as well as in getSound()
sound.fade(0, options.maxVolume, options.aFadeIn, id2); // FADE IN
setTimeout(function () {
sound.fade(options.maxVolume, 0, options.aFadeOut, id2); // FADE OUT
options.numberOfSounds--; //when it fades out subtract one
// Attempt to clean up the sound object
setTimeout(function () {
sound.stop();
sound.unload();
}, options.aFadeOut + 1000);
}, playDuration);
}
}, 0);
}, 0);
}
// PLAYER FOR MAIN SOUND FUNCTION /////////////////////////////
function getSound() {
return new Howl({
src: [options.soundFileName],
autoplay: true,
loop: true,
volume: 0,
fade: 0 // removes the blip
});
}
</script>
<script src="js/howler.core.js"></script>
<script src="js/siriwave.js"></script>
<script src="js/player.js"></script>
</body>
</html>
2 ответа
Да, довольно часто такие вещи передаются как объект параметров.
function loop(options) {
// use options.sound, options.aStartMin, etc
}
Затем вы можете сохранить объект параметров отдельно, если хотите:
var options1 = {
sound: 'audio/sample.mp3',
aStartMin: 2,
aStartMax: 200,
seekMin: .5,
seekMax: 2
}
На самом деле, это настолько распространено, что (в зависимости от того, какие браузеры вы хотите поддерживать, или от уровня проникновения в вас) теперь есть поддержка того, что называется "деструктуризацией объекта", что делает это еще проще:
function loop({ sound, aStartMin, aStartMax, etc }) {
// Can now use sound, aStartMin, aStartMax, etc as if they were plain arguments.
}
Другие преимущества назначения деструктуризации с использованием объекта:
- Значения передаются по имени, а не по порядку (свойства объекта в любом случае не имеют порядка)
- Не все (или любые) значения должны быть использованы
- Если свойство отсутствует, оно передается как неопределенное
- Вы все еще можете установить значения по умолчанию в объявлении
// Define 3 properties on options object
var opts = {
opt1: 'opt1 value',
opt2: 'opt2 value',
opt3: 'opt3 value'
};
// Use some option properties, even not defined props
function myFunc({opt3, opt1, foo, bar = 'bar'}) {
console.log(`opt1: ${opt1}\nopt3: ${opt3}\nfoo : ${foo}\nbar : ${bar}`);
}
myFunc(opts);