我有一段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])}
。如何得到我想要的东西?
感谢。
答案 0 :(得分:2)
您需要为函数的每个实例提供自己的变量:
for(var l = a.length, i = 0; i < l; i++)
{
(function (x) {
d[a[x]] = function(){console.log(a[x])};
})(i)
}
答案 1 :(得分: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的新“版本”。对于非常大的数据集,这是浪费时间和内存。
这种方法增加了清晰度和可重用性的优点。如果循环中发生了大量逻辑,则将其封装在命名函数中允许将来的审阅者了解您为函数命名的内容。您还可以在应用程序的其他部分重用该功能。