你能从字符串数组中创建一堆函数吗?

时间:2011-06-25 22:15:02

标签: javascript prototype-programming

我将如何沿着这条线做点什么?我需要使用新的Function()吗?

var bunchOfFunctionNames = ["functions", "of", "functions"];

for (var i = 0; i < eventTypes.length; i++) {
    myObject.prototype[bunchOfFunctionNames[i]] = function() {
        // do some stuff
    };
};

1 个答案:

答案 0 :(得分:2)

在re:我关于在函数创建循环中获取“i”的值的评论中,问题是所有函数都将“i”共享。换句话说,在外部函数中只有一个“i”变量(循环所在的位置),所以如果你在你正在创建的函数中引用“i”,那么它将无法正常工作(可能)。所有这些都将“i”视为你的名字数组的“长度”,因为这就是它在循环结束时的意义。

有几种方法可以解决这个问题。如果你是一名计划程序员,那么你就是这样做的:

for (var i = 0; i < eventTypes.length; i++) {
    myObject.prototype[bunchOfFunctionNames[i]] = (function(copy_of_i) {
        return function() {
            // do some stuff, merrily referencing "copy_of_i"
        }
    })(i);
};

循环中的“匿名”函数提供了一个新的范围,因为“i”作为参数传递(称为“copy_of_i”,即使我讨厌变量名中的下划线),它对是安全的真正的功能来使用它。匿名函数返回真实函数,这就是最终在对象原型中的函数。

另一个选择是将该匿名函数拉出循环:

function makeFunctionForName(i) {
  return function() {
    // do something, and now "i" is the parameter and "safe"
  };
}

for (var i = 0; i < eventTypes.length; i++) {
    myObject.prototype[bunchOfFunctionNames[i]] = makeFunctionForName(i);
}