JavaScript 动态创建函数列表

3

我有一段 JavaScript 代码,想要创建一个函数列表。所有的函数将被放在一个字典 d 中。 d["a"] 将给我函数 function() {console.log("a")}d["b"] 将给我函数 function() {console.log("b")} 等等。这是我的代码:

var a = "abcdefghijklmnopqrstuvwxyz1234567890".split("");
var d = {};
for(var l = a.length, i = 0; i < l; i++)
{
    d[a[i]] = function(){console.log(a[i])};
}

然而,当我运行上面的代码时,d["a"]d["b"]将是相同的,它们都指向function(){console.log(a[i])}。如何获得我想要的结果呢?
谢谢。
2个回答

2

您需要为每个函数实例提供自己的变量:

for(var l = a.length, i = 0; i < l; i++)
{
  (function (x) {
    d[a[x]] = function(){console.log(a[x])};
  })(i)
}

当我在Chrome上运行它时,我收到了“SyntaxError:Unexpected token(”错误。 Chrome支持语法吗? - Just a learner
将外部函数用括号括起来,像这样:(function(x) { ... })(i) - Butt4cak3
抱歉,是的,function() { }() 必须写成 (function () {})() - user229044

0

它们不指向同一个实例的 function(){console.log(a[i])},相反,你创建了一堆使用相同引用的 i 的函数。随着 for 循环执行,i 指向的值会发生变化。

其他提供的答案可以工作,但需要生成两倍于所需的函数。

function makeLogFunction(whatToLog) {
    return function() {
        console.log(whatToLog);
    }
}

var a = "abcdefghijklmnopqrstuvwxyz1234567890";
var d = {};
for(var l = a.length, i = 0; i < l; i++) {
    d[a[i]] = makeLogFunction(a[i]);
}

这里,我有一个makeLogFunction函数,它将返回一个新的函数,该函数始终打印whatToLog。其他答案每次循环执行时都会生成一个新的“版本”makeLogFunction。对于非常大的数据集,这是一种浪费时间和内存的做法。

这种方法具有清晰度和可重用性的额外优点。如果在您的循环中发生了大量逻辑操作,将其封装在命名函数中允许未来的审阅者通过您给函数的名称来了解正在发生的情况。您还可以在应用程序的其他部分重复使用该函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接