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;但是当我突然进入第二个循环时,两个 id 都变成了 1。这怎么可能?

在此处输入图像描述

4

1 回答 1

4

因为第一次 playList 是空的,所以为什么播放列表的长度为零,但在 init 调用之后它有一个项目,所以 playList 的长度在第二次 init 调用时变为 1,所以 id 的值取决于 init 调用的数量。

由于您没有创建任何新对象,因此每次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);
于 2012-11-08T20:56:26.000 回答