Javascript xmlhttprequest和Web音频API的范围问题?

Javascript xmlhttprequest和Web音频API的范围问题?,javascript,web-audio-api,Javascript,Web Audio Api,我是JS新手,我一直在尝试用Web音频API实现一种混音器。我已经读了一些关于JS的作用域和实现“类”的不同方法的书,但显然我还不太了解它。 我有一个soundClass对象,我希望它包含一组track对象,我希望解码后在tracklist上推送一个新的track。但是,每当我console.log如下所示的tracklist或每个track,第一个日志(console.log(track name'+that.track.name);)显示正确的曲目名称,但如果我尝试记录that.track对

我是JS新手,我一直在尝试用Web音频API实现一种混音器。我已经读了一些关于JS的作用域和实现“类”的不同方法的书,但显然我还不太了解它。 我有一个
soundClass
对象,我希望它包含一组
track
对象,我希望
解码后在
tracklist
上推送一个新的
track
。但是,每当我
console.log
如下所示的
tracklist
或每个
track
,第一个日志(
console.log(
track name'+that.track.name);
)显示正确的曲目名称,但如果我尝试记录
that.track
对象本身,它总是显示添加的最后一个曲目,因此,如果我调用
soundClass.newTrack('track1.mp3')
soundClass.newTrack('track2.mp3')
console.log(soundClass.tracklist)
我会得到一个包含两个track2.mp3对象的数组。 我想这是一个范围问题或者异步解码的问题,但我实际上不知道,所以这可能只是一些愚蠢的错误

如果这是一个非常基本的问题,我很抱歉,但我非常感谢您的帮助

var soundClass = {

audioContext: new webkitAudioContext,
currentTime: 0,
track: {
    name: 0,
    trackSource: null,
    trackBuffer:null,
    isLoaded: false,
},
tracklist: [],
newTrack: function(filename){
    var that=this;      
    var request =new XMLHttpRequest();
    request.open("GET",filename,true);
    request.responseType="arraybuffer";
    request.onload=function(){
            that.audioContext.decodeAudioData(request.response,function(buffer){

                that.track.trackBuffer=buffer;
                that.track.name=filename;
                that.track.isLoaded=true;
                that.track.trackSource=that.audioContext.createBufferSource();

                console.log('track name '+ that.track.name);
                console.log(that.track);

                that.tracklist.push(that.track);

                });

    }
    request.send();
},

您只有一个对象
soundclass.track
。在
request.onload
函数中,您一次又一次地修改同一对象。因此,您的
轨迹列表
包含同一对象两次。你能做的就是

var track = {};
track.trackBuffer=buffer;
...
that.tracklist.push(track);

并摆脱soundclass.track。

谢谢!,我真是太蠢了,竟然把
音轨
作为文字放在
soundclass
里面。但我很好奇为什么会这样。即使我正在覆盖
轨迹
,我也会首先将其附加到
轨迹列表
数组中,所以数组应该可以吗?无论如何,再次谢谢你!阵列很好。如果答案对你有用,你介意接受吗?:)但是,为什么tracklist的日志输出只是最后一个对象,其追加次数与调用newTrack的次数相同呢?只有一个对象。首先将其值设置为“track1.mp3”等,并将其添加到数组中
tracklist[0]
指向值为“track1.mp3”的
track
。然后更改该值并再次将其添加到数组中
tracklist[1]
现在也指向
track
,并且
track
的值为“track2.mpg”<代码>曲目列表[0]
当然仍然指向
曲目。而
track
的值是。。。“track2.mp3”^^