返回动态生成的函数而不使用eval()

时间:2013-07-01 08:40:42

标签: javascript

我正在尝试在迭代数组时动态创建函数 我需要根据当前索引的值设置数组中的参数。

例如:

var array = ['apple','orange','banana'];

我需要这三个功能:

function() { return 'apple' };
function() { return 'orange' };
function() { return 'banana' };

我试图从外部函数返回一个构造函数,但其​​中的表达式不会被评估,我最终得到其中三个:

function() { return array[i] };

有没有办法动态创建这样的函数而不使用eval()?

3 个答案:

答案 0 :(得分:4)

您可以创建如下函数:

var funcs = {};
for (var i=0;i<array.length;i++)
{
    funcs[array[i]] = (function(val)
    {
        return function()
        {
            return val;
        };
    }(array[i]));
}

可以像这样调用:

funcs.apple();// returns "apple"

但同样,取决于某些var的值:

var someVar = 'banana';
if (funcs.hasOwnProperty(someVar))
{
    funcs[someVar]();
}

如果你所追求的是一个(可能是全局的)函数,那取决于例如URI,你只需写下:

var myFunc = (function()
{
    var retVal = location.mathname.match(/^\/([^\/]+)/)[1];
    return function()
    {
        return retVal;
    };
}());

请注意,该功能不会被提升,因为它是一个表达式 我已经写了很多关于IIFE的(Immediatly Invoked Function Expressions),它们如何工作以及为什么,so best check my answer here如果你不完全理解这些代码片段。一旦你掌握了逻辑就很容易了,你很快就会发现自己一直在编写这样的代码......真的是非常强大的东西,闭包就是这样!

答案 1 :(得分:1)

这就是我要做的事情:

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

var array = ["apple", "orange", "banana"];

var fruit = array.map(constant);

alert(fruit[0]()); // apple
alert(fruit[1]()); // orange
alert(fruit[2]()); // banana

简单。请参阅演示:http://jsfiddle.net/tfS2F/

您还可以将初始数组用作键,如下所示:

alert(fruit[array.indexOf("orange")]()); // orange

请参阅演示:http://jsfiddle.net/tfS2F/1/

答案 2 :(得分:0)

这个不行,我留下来说明臭名昭着的循环问题:

实现这一目标的最佳方法是在创建函数之前创建一个context var,希望这说明它http://jsfiddle.net/jkymq/

var array = ['apple','orange','banana'];
var methods = {}
for (pos = 0 ; pos < array.length; pos ++){
    var target = array[pos];
    var newMethod = function(){alert (target);}
    methods[target] = newMethod;
}
for (foo in methods){
    methods[foo]();
}