我将如何沿着这条线做点什么?我需要使用新的Function()吗?
var bunchOfFunctionNames = ["functions", "of", "functions"];
for (var i = 0; i < eventTypes.length; i++) {
myObject.prototype[bunchOfFunctionNames[i]] = function() {
// do some stuff
};
};
答案 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);
}