2

自己呼び出し関数で配列を初期化しようとしています。例として簡単にするために、初期値は 0 から 4 までの数字の 2 乗であると仮定します。newキーワードは新しいオブジェクトを作成するため、this.xまたはで新しく作成されたオブジェクトのフィールドにアクセスできます。キーワードthis[x]に続く IIFE 本体内new。コードは次のとおりです。

var arr = new (function() {
    for (var i=0; i<5; i++) { this[i]=i*i; }
})();

これで、 、 getarrなどの変数の対応するフィールドにアクセスできます。オブジェクトと同じように扱うだけならまったく問題ありませんが、配列のように扱おうとすると問題が発生します。つまり、次のような関数を適用することはできません。arr[4]16arrreduce

< arr.reduce(...);
> TypeError: arr.reduce is not a function

これarrは、実際には配列ではなくオブジェクトであるためです。

< arr;
> ({0:0, 1:1, 2:4, 3:9, 4:16})

だからここに私の質問があります:このメソッド内でそのような動作を回避するにはどうすればよいですか? この新しく作成されたオブジェクトを配列として JavaScript に解釈させる方法は?

4

2 に答える 2

3

newそのためにキーワードを使用する必要はありません...

var arr = (function() {
               var x = [];
               for (var i=0; i<4; i++)
                   x.push(i*i);
               return x;
           })();

newキーワードはオブジェクトを作成してそのコンストラクターを設定し、次にそれにバインドしthisて関数を呼び出します。関数を呼び出す以外は何も必要ないので、そうするだけです。

于 2012-09-23T16:28:22.660 に答える
3

IEFE がなければ、より短く、より明確になります。

var arr = [];
for (var i=0; i<5; i++) arr[i] = i*i;

追加のカウンター変数がなければ、次のiことができます。

for (var arr=[]; arr.length<5; ) arr[arr.length] = Math.pow(arr.length, 2);
于 2012-09-23T17:04:50.293 に答える