3

任意の値の配列があります。配列を元の値を返す関数の配列に変換する関数を作成したので、a[3] を呼び出す代わりに a3 を呼び出します。

動作しないコードは次のとおりです。コード。このエラーが発生しますCannot call method '1' of undefined

var numToFun = [1, 2, { foo: "bar" }];
var numToFunLength = numToFun.length;

function transform(numTo) {
    for (var i = 0; i < numToFunLength; i++) {
        (function(num){
            numTo.unshift(function() {
                return num;
            });
        }(numTo.pop())) 
    }
}

var b = transform(numToFun);

console.log(numToFun);
console.log(b[1]());​
4

3 に答える 3

4

私が自分の質問を書いている間に他の人がすでにあなたの質問に答えていますが、とにかく投稿します.

function transform(numTo) {
    var r = [];
    for (var i = 0; i < numTo.length; i++) {
        r[i] = (function (v) {
            return function() {
                return v;
            }
        }(numTo[i]));
    }
    return r;
}

(また、ハードコーディングされた長さを numToFunLength から numTo.length に変更したので、transform() 関数は、グローバルな numToFun 変数以外の入力に対しても機能します。)

デモを参照してください。

更新: Sugarライブラリを使用してそれを行うさらにエレガントな方法:

function transform(array) {
    return array.map(function (v) {
        return function() {
            return v;
        }
    });
}

私がこの構文を気に入っているのは、値の配列をそれらの値を返す関数の配列にマップすることがより明確になるためです。

デモを参照してください。

于 2012-07-24T09:16:38.963 に答える
1

関数transformは何も返しません。だからbですundefined

return numTo;

jsFiddleデモ

一方、配列はとにかく参照として関数に渡されるため、元の配列が変更されます。何も返さなくても問題ありません。var b = transform(numToFun);行を省略して、単にと書いてtransform(numToFun)ください。

于 2012-07-24T09:06:24.887 に答える
1

変換関数は何も返しません。したがって、bは未定義です

于 2012-07-24T09:06:52.907 に答える