我正在尝试在迭代数组时动态创建函数 我需要根据当前索引的值设置数组中的参数。
例如:
var array = ['apple','orange','banana'];
我需要这三个功能:
function() { return 'apple' };
function() { return 'orange' };
function() { return 'banana' };
我试图从外部函数返回一个构造函数,但其中的表达式不会被评估,我最终得到其中三个:
function() { return array[i] };
有没有办法动态创建这样的函数而不使用eval()?
答案 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
答案 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]();
}