2012-11-08 50 views
1

可能重复:
Javascript infamous Loop problem?添加此对象插入到数组

for (var i=0; i<songList.length; i++){ 
     test.init({ 
     }); 
} 

var test = { 
    init: function (params) { 
     var my = this; 

     var backend = WaveSurfer.Audio; 

     if (!params.predrawn) { 
      backend = WaveSurfer.WebAudio; 
     } 
     var id = playList.length; 
     this.id = id; 

     this.backend = Object.create(backend); 
     this.backend.init(params); 

     this.drawer = Object.create(WaveSurfer.Drawer); 
     this.drawer.init(params); 

     this.backend.bindUpdate(function() { 
      my.onAudioProcess(); 
     }); 

     this.bindClick(params.canvas, function (percents) { 
      my.playAt(percents); 
     }); 

    playList.push(my); 

当调试这个脚本:我的ID为0,为所述第一元件;但是当我突然进入第二个循环时,两个ID都变成1.这怎么可能?

enter image description here

+0

所以...你的元素添加到播放列表中添加新的项目,你困惑,它的1元大? – Wug

+1

不,我很困惑,他们有两个ID:1,当我期望第一个是0,第二个是1 – Thomas

+0

@ThomasVerbeke代码有'this.id = id',它将id设置为1我的 – Amareswar

回答

4

因为第一次播放列表是空的,之所以播放列表的长度为零,但初始化称之为后有一个项目,以便播放列表的长度成为1秒的init调用,这样的id的值取决于初始化呼叫的号码。

由于您没有创建任何新对象,因此每次my都会引用相同的对象。因此my中的任何更改都会反映在播放列表中的所有推送项目中。

修改后的代码:如果你想在每一个初始化调用

var test = { 
    init: function (params) { 
     var my = {}; 

     var backend = WaveSurfer.Audio; 

     if (!params.predrawn) { 
      backend = WaveSurfer.WebAudio; 
     } 
     var id = playList.length; 
     my.id = id; 

     my.backend = Object.create(backend); 
     my.backend.init(params); 

     my.drawer = Object.create(WaveSurfer.Drawer); 
     my.drawer.init(params); 

     my.backend.bindUpdate(function() { 
      my.onAudioProcess(); 
     }); 

     my.bindClick(params.canvas, function (percents) { 
      my.playAt(percents); 
     }); 

    playList.push(my);