У меня есть объект toKeep , где MIDI-нота содержится в свойстве label каждого объекта.

Я хочу, чтобы он воспроизводился после определенной задержки, в зависимости от количества полученных нот.

Проблема в том, что переменная pinned_neighbor остается неизменной, даже если она должна измениться.

Проблема в том, что функция setTimeout не получает данные?

 for (var ed = 0; ed {amp}lt; toKeep.length; ed  ) { var pinned_neighbor = toKeep[ed].label if (pinned_neighbor != undefined) { setTimeout(function(pinned_neighrbor) { output.playNote(pinned_neighbor, parseInt(midi.substr(2, 2))); output.stopNote(pinned_neighbor, parseInt(midi.substr(2, 2)), { time: " "   Math.floor(timefloor / toKeep.length) }); console.log('playing an edge note '   pinned_neighbor   ' at '   timecodea   ' on '   parseInt(midi.substr(2, 2))); timecodea = timecodea   Math.floor(timefloor / toKeep.length); }, timecodea); } } 

Вы не передаете pinned_neighbor в setTimeout, и вы не можете сделать это так, как вы написали код в настоящее время (насколько я знаю).

Вам нужно использовать какое-то замыкание, чтобы сохранить значение pinned_neighbor . Вы можете использовать IIFE или создать другую функцию, которая вызывает setTimeout .

Подход IIFE

 for (...) { var pinned_neighbor = ...; if (pinned_neighbor != undefined) { // pn comes from the parameter pinned_neighbor passed at the bottom (function (pn) { setTimeout(function () { // Play note, etc }, timecodea); // Captures the value of pinned_neighbor })(pinned_neighbor); } } 

Отдельная функция

 function playNote(pinned_neighbor, toKeepLength) { setTimeout(function () { // Play note using pinned_neighbor, etc }, timecodea); } // In your for loop var pinned_neighbor = ... if (pinned_neighbor != undefined) { playNote(pinned_neighbor, toKeep.length); }