-5

インタビューでこんな質問が

JavaScript を使用して、n 要素の配列を記述します。配列内の各要素は、独自のインデックスの console.log を呼び出す関数です。たとえば、最初の要素は console.log 0 になり、2 番目の要素は console.log 1 になります....

前もって感謝します

編集:調査する前に質問して申し訳ありません。私はプログラミングが初めてで、クロージャーが何であるかを知りません。検索で何かを見つけることができませんでした。私は自分で答えを得ましたが、ここに私が抱えていた問題があります。私はこのようなことを書きました

n = 10
var array = []
for (var i=0; i < n; i ++) {
array[i] = function() {
        console.log(i);
    }
}

for (var j=0; j < n; j ++) {
    array[j]()
}
4

2 に答える 2

2

各配列要素に関数を配置すると、配列インデックスごとにカスタム関数を何らかの方法でバインドしない限り、その関数は配列インデックスが何であるかがわからないため、求めていることを行う簡単な方法はありません。

しかし、これはすべて、本当の問題が何であるかを私たちに伝えていないように聞こえます. 配列を繰り返し処理し、配列要素で関数を呼び出す場合は、その関数のインデックスを最初の引数として渡すだけです。

配列内の各関数を呼び出して、次のようにそのスロットのインデックスを渡すことができます。

function fn1(index) {
    console.log(index);
    // do other things here specific to this function
}
// fn2 ... fn4 definitions

var listOfFunctions = [fn1, fn2, fn3, fn4];

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

または、本当の問題が何であるかを教えてください。そうすれば、その解決をより直接的に支援できます。

于 2013-06-13T23:20:34.963 に答える
0

これを行う(複数の方法のうちの)1つを次に示します。

var arr = [];

for (var i = 0; i < 10; i++) {
    arr.push(function(){
        console.log(this.indexOf(arguments.callee));
    });
}

arr[3](); //3
arr[7](); //7

this方法で関数を呼び出すと、配列が参照されますarr[index]()arguments.calleeそれ自体の内部で、関数自体を参照します。そのため、関数は、アタッチされている配列内で自分自身を検索し、見つかったインデックスを出力します。

編集

jfriend00 が正しく指摘したように、arguments.callee非推奨であり、厳密モードではサポートされていません。したがって、ここに「よりクリーンな」ソリューションがあります(Bergiからの提案による):

var arr = [], func;

for (var i = 0; i < 10; i++) {
    arr.push(function printIndex(){
        console.log(this.indexOf(printIndex));
    });
}

arr[3](); //3
arr[7](); //7
于 2013-06-13T23:34:27.083 に答える