javascript闭包未捕获类型错误:无法读取属性';请求';未定义的

javascript闭包未捕获类型错误:无法读取属性';请求';未定义的,javascript,closures,typeerror,web-audio-api,Javascript,Closures,Typeerror,Web Audio Api,我正试图通过使用for循环对对象列表的过程进行迭代来减少以前工作过的一些重复代码 var context = new (window.AudioContext || window.webkitAudioContext)(); //Set up the objects for each part var solo = { audio: context.createBufferSource(), audioData: context.createBufferSource(),

我正试图通过使用for循环对对象列表的过程进行迭代来减少以前工作过的一些重复代码

var context = new (window.AudioContext || window.webkitAudioContext)();

//Set up the objects for each part
var solo = { audio: context.createBufferSource(),
     audioData: context.createBufferSource(),
     file: "mp3s/Faith_solo.mp3",
     request: new XMLHttpRequest(),
     isPlaying: false,
     startTime: null,
     seekAsOfLastPause: 0,
     duration: 0
        }
var t1 = { audio: context.createBufferSource(),
   audioData: context.createBufferSource(),
   file: "mp3s/Faith_t1.mp3",
   request: new XMLHttpRequest(),
   isPlaying: false,
   startTime: null,
   seekAsOfLastPause: 0,
   duration: 0
     }
var t2 = { audio: context.createBufferSource(),
   audioData: context.createBufferSource(),
   file: "mp3s/Faith_t2.mp3",
   request: new XMLHttpRequest(),
   isPlaying: false,
   startTime: null,
   seekAsOfLastPause: 0,
   duration: 0
        }
var baritone = {
     audio: context.createBufferSource(),
     audioData: context.createBufferSource(),
     file: "mp3s/Faith_baritone.mp3",
     request: new XMLHttpRequest(),
     isPlaying: false,
     startTime: null,
     seekAsOfLastPause: 0,
     duration: 0
        }
var bass = { audio: context.createBufferSource(),
     audioData: context.createBufferSource(),
     file: "mp3s/Faith_bass.mp3",
     request: new XMLHttpRequest(),
     isPlaying: false,
     startTime: null,
     seekAsOfLastPause: 0,
     duration: 0
       }

var allParts = [solo, t1, t2, baritone, bass];

/* create requests, send requests, load files */

for(i=0;i<allParts.length;i++){
    allParts[i].request.open("GET", allParts[i].file, true);
    allParts[i].request.responseType = "arraybuffer";
    allParts[i].request.onload = function(){
        **context.decodeAudioData(allParts[i].request.response, onDecoded);**
    }
    function onDecoded(buffer){
        allParts[i].audioData.buffer = buffer;
    }
    allParts[i].request.send();
}
var context=new(window.AudioContext | | window.webkitadiocontext)();
//为每个零件设置对象
var solo={audio:context.createBufferSource(),
audioData:context.createBufferSource(),
文件:“mp3s/Faith_solo.mp3”,
请求:新建XMLHttpRequest(),
isplay:false,
开始时间:空,
请参见LastPause:0,
持续时间:0
}
var t1={audio:context.createBufferSource(),
audioData:context.createBufferSource(),
文件:“mp3s/Faith_t1.mp3”,
请求:新建XMLHttpRequest(),
isplay:false,
开始时间:空,
请参见LastPause:0,
持续时间:0
}
var t2={audio:context.createBufferSource(),
audioData:context.createBufferSource(),
文件:“mp3s/Faith_t2.mp3”,
请求:新建XMLHttpRequest(),
isplay:false,
开始时间:空,
请参见LastPause:0,
持续时间:0
}
男中音={
音频:context.createBufferSource(),
audioData:context.createBufferSource(),
文件:“mp3s/Faith\u baritone.mp3”,
请求:新建XMLHttpRequest(),
isplay:false,
开始时间:空,
请参见LastPause:0,
持续时间:0
}
var bass={audio:context.createBufferSource(),
audioData:context.createBufferSource(),
文件:“mp3s/Faith_bass.mp3”,
请求:新建XMLHttpRequest(),
isplay:false,
开始时间:空,
请参见LastPause:0,
持续时间:0
}
var allParts=[独奏、t1、t2、男中音、低音];
/*创建请求、发送请求、加载文件*/

对于(i=0;i,您需要使用let.或使用forEach或allParts.map在循环中定义i

for(let i=0;i<allParts.length;i++){ ...

可能重复感谢链接此。我查看了for循环并将其更改为forEach,它似乎可以解决此问题!是的,这似乎可以解决此问题。我更新了使用forEach的函数。非常感谢!
allParts.map(function(part, i){ ... })