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

谢谢。

4

2 回答 2

2

您需要为函数的每个实例赋予其自己的变量:

for(var l = a.length, i = 0; i < l; i++)
{
  (function (x) {
    d[a[x]] = function(){console.log(a[x])};
  })(i)
}
于 2013-10-02T19:08:47.293 回答
0

它们没有指向 的同一个实例function(){console.log(a[i])},相反,您创建了一堆函数,它们都使用对 的相同引用i。指向的值i随着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 的新“版本”。对于非常大的数据集,这是浪费时间和内存。

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

于 2013-10-02T19:38:32.583 回答