如何根据变量来复制函数

How can I replicate functions depending on a variable?

本文关键字:复制 函数 变量 何根      更新时间:2023-09-26

很抱歉,我不知道我还能怎么描述。

场景如下:我有大量的if语句试图做类似下面代码的事情:

var wv == today.getDate();
if(wv == 0){
wv0.forEach(function(entry, index)...
if(wv == 1){
wv1.forEach(function(entry, index)...
if(wv == 2){
wv2.forEach(function(entry, index)...

问题是wvX.forEach之后的所有内容对于每个代码块都是相同的。因此,我知道它可以被浓缩,但我不知道如何做到这一点。

我所尝试做的是定义一个新的变量,它会给我wvX数字取决于它是:

var daycode = 'wv' + getDate();

现在它给了我(所以今天,在星期天,它将返回wv0,但是当我尝试像这样压缩上面的内容时:

if (wv == 0)
daycode.forEach(function(entry, index)...

也不行。我知道这只适用于wv == 0或周日,但它仍然不起作用。然而,

if (wv == 0)
wv0.forEach(function(entry, index)...

仍然可以工作,即使它和上面的代码块是一样的,就像现在的daycode = wv0

编辑:所以我刚刚意识到一些事情。这可能是因为daycode被视为一个变量。例如,即使wv0.length返回1, daycode.length返回3,因为daycode的值是wv0, wv0的长度是3。那我还能怎么做呢?

您可以这样做,我认为这是习惯用法,并且不诉诸eval。

var f = function(entry, index){ ... };
var mappings = { 0: wv0, 1: wv1...};
var wv = today.getDate();
mappings[wv].forEach(f);

显式地将日期结果映射到要迭代的对象。

可以在变量中声明函数并将其传递给forEach方法。

var doThis = function(entry, index {
  // Do something
}
if (wx == 0) { 
  wx3.forEach(doThis)
}

这是非常不安全的方法,确保你知道你在做什么。使用eval方法。

 eval(fname)(arg1, arg2);

假设你有这样的声明:

var arr = [1,4,5,6]

可以使用eval:

eval('arr')

它会返回[1,4,5,6],即使你真的在传递一个字符串

所以,你可以创建一个函数,它接受与你正在迭代的数组相关联的字符串参数。

var iterate = function(arrName) {
  var arr = eval('arrName');
  arr.forEach(......)

对于if语句,也许可以考虑使用switch语句来简化代码。