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 回答