0

メソッドを2回作成するには? 関数本体でこれを変更する方法がわかりません。うまくいかないのはなぜですか?

function twice() {
    var buf = [];
    for ( var i = 0; i < this.length; i++ ) {
        buf.push(this[i]);
    }

    for ( var i = 0; i < this.length; i++ ) {
        buf.push(this[i]);
    }
    this = buf;
}

Array.prototype.twice = twice;

a = [1,2,3];
a.twice(); 
a; // [1,2,3,1,2,3]
4

2 に答える 2

2

関数本体でこれを変更する方法がわかりません

の値を意味する場合はthis、できません。しかし、あなたはあなたがしていることのためにする必要はありません

あなたは非常に近いです。削除するのはかなりの部分です:

function twice() {
    var i, l;
    for (l = this.length, i = 0; i < l; ++i) {
        this.push(this[i]);
    }
}

配列はオブジェクトであることを忘れないでください。その内容を変更するには、その内容を変更するだけです。それへの参照を変更する必要はありません。

ただし、このトリックは最新のブラウザーで使用できることに注意してください。

function twice() {
    this.push.apply(this, this);
}

Function#applyこれは、関数を呼び出す関数を使用することで機能します (つまりpush、私たちの場合)、最初の引数を操作対象のオブジェクトとして使用し、2 番目の引数をその関数に渡す引数として使用します (配列として受け取ります)。MDN仕様の詳細。push任意の数の引数を渡すことができ、それぞれを順番にプッシュすることが起こります。そのため、配列の内容をもう一度配列に追加しようとしている場合は、その 1 行で実行できます (最近のブラウザーでは、一部の古い IE 実装では、この の使用が好まれませんpush.apply)。

于 2013-08-22T23:34:04.100 に答える