0

Possible Duplicate:
Javascript closure inside loops - simple practical example

You have an array of arbitrary values. Write a transform function in the global scope that will transform the array to an array of functions that return the original values, so instead of calling a[3], we will call a3.

For example I want:

var a = ["a", 24, { foo: "bar" }];
var b = transform(a);

a[1]; // 24
b[1](); // 24

However I am getting:

b
[function () { 
              return this.temp;
         }, function () { 
              return this.temp;
         }, function () { 
              return this.temp;
         }]

Here is my code:

var a = ["a", 24, { foo: "bar" }];

var b = transform(a);

document.writeln(a[1]); // 24
document.writeln(b[0]()); // 24
document.writeln(b[1]()); // 24

function transform(array) {

  b = [];
  var i;
     for (i = 0; i < array.length; i += 1) {
        b[i] = function () { 
          return temp;
        };
     }
  return b;
}
4

4 に答える 4

1
function transform(array) {

  b = [];
  var i;
  for (i = 0; i < array.length; i += 1) {
    b[i] = (function (x) { 
              return function () { return x; };
            })(array[i]);
  }
  return b;
}

デモ http://jsbin.com/udasoj/1/edit

于 2013-01-15T03:47:34.673 に答える
0

既存の回答はどれもうまくいかないことに注意してください。それらはすべて、 の最後の値を返す関数を生成しますavar関数スコープであり、クロージャーとの相互作用が不十分です。

同様の問題を説明している、私が書いた他の回答を参照してください: https://stackoverflow.com/a/14330595/17875

于 2013-01-15T03:55:59.033 に答える
0

を呼び出す場合、コードは正しいb[0]()ので、返される値を取得する必要があります。

于 2013-01-15T03:45:04.093 に答える
0

とはtemp? これを達成する方法は、別の関数を介して関数を生成することです。

function transform(array) {
  b = [];
  var i;
  for (i = 0; i < array.length; i += 1) {
     b[i] = createReturnFunction(a[i]);
    };
  }

  return b;
}

function createReturnFunction(value){
  return function(){ return value; }; 
}

作業フィドル: http://jsfiddle.net/eFWyf/

于 2013-01-15T03:46:14.230 に答える