1

重複の可能性:
Javascriptの悪名高いループの問題?

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です。しかし、2番目のループに入ると、突然両方のIDが1になります。これはどのようにして可能ですか?

ここに画像の説明を入力してください

4

1 に答える 1

4

最初の playList は空であるため、プレイリストの長さはゼロですが、init 呼び出しの後には 1 つの項目があるため、2 回目の init 呼び出しでは playList の長さが 1 になるため、id の値は init 呼び出しの数に依存します。

新しいオブジェクトを作成していないため、毎回my同じオブジェクトを参照します。そのため、変更はmyプレイリスト内のプッシュされたすべてのアイテムに反映されます。

変更されたコード: 各 init 呼び出しで新しい項目を追加する場合

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);
于 2012-11-08T20:56:26.000 に答える