4

最新のWebアプリケーションで作業していて、このArray.forEach関数を使用する必要があるとき、関数が組み込まれていない古いブラウザーにサポートを追加するために使用される次のコードを常に見つけました。

/**
 * Copyright (c) Mozilla Foundation http://www.mozilla.org/
 * This code is available under the terms of the MIT License
 */
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun /*, thisp*/) {
        var len = this.length >>> 0;
        if (typeof fun != "function") {
            throw new TypeError();
        }

        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this) {
                fun.call(thisp, this[i], i, this);
            }
        }
    };
}

コードの機能と動作は完全に理解していますが、仮thispパラメーターをコメントアウトしてコピーし、arguments[1]代わりにを使用してローカル変数として設定することを常に確認しています。

なぜこの変更が行われたのか誰かが知っているのだろうかと思っていました。私が知る限り、コードはthisp変数ではなく正式なパラメーターとして正常に機能したのでしょうか。

4

2 に答える 2

5

Array.prototype.forEach.lengthはとして定義されているため、プロパティも設定され1ている場合、実装関数はよりネイティブになります。.length1

http://es5.github.com/#x15.4.4.18

forEachメソッドの長さプロパティは1です。

(は、その定義に基づいfunc.lengthて取る引数の量です。)func

であるためfunc.lengthには、 1つの引数のみを取るよう1に定義する必要があります。func関数自体では、常にすべての引数を。で取得できますarguments。ただし、1つの引数を取る関数を定義することにより、.lengthプロパティは1です。したがって、仕様によるとより正確です。

于 2011-12-01T21:34:43.970 に答える
-1

これにより、プロトタイプ関数に相当する文字列を反復処理することなく、配列内の各値を反復処理します。

Array.prototype.forEach = function(fun /*, thisp*/) {
    if (typeof fun != "function") {
        throw new TypeError();
    }

    for(i = 0; i < this.length; i++){
        ...
    }

}
于 2011-12-01T21:35:40.940 に答える