Javascript 动态创建一个函数列表

Javascript create a list of functions dynamically

本文关键字:一个 函数 列表 动态 创建 Javascript      更新时间:2023-09-26

我有一段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])}。如何得到我想要的?

谢谢。

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

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

它们不指向相同的function(){console.log(a[i])}实例,相反,您创建了一堆函数,这些函数都使用相同的引用ii指向的值在for循环执行时发生变化。

提供的其他答案将起作用,但它涉及生成所需数量的两倍函数。

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的新"版本"。对于非常大的数据集,这是浪费时间和内存。

这种方法增加了清晰度和可重用性的优点。如果循环中发生了大量逻辑,则将其封装在命名函数中可以让未来的审阅者通过您为函数指定的名称来了解正在发生的事情。您还可以在应用程序的其他部分中重用该函数。