【问题标题】:JS - Push functions into an array and name themJS - 将函数推入数组并命名
【发布时间】:2023-03-08 18:16:01
【问题描述】:

我正在尝试将函数添加到数组中。这些必须命名为“opdracht1”到“opdracht10”。 虽然,我不知道如何给它起名字。

var opdrachtArray = [];

for (i = 0; i < 10; i++) { 
    opdrachtArray.push(function() {func(i); });
}

它添加了功能,但正如我之前所说,我不知道如何添加名称。

另外,我以后可以定义函数并在需要时调用它们吗?

【问题讨论】:

  • 为什么要命名?
  • 因为我将使用每个函数作为我正在制作的单独任务。这使我可以单独编辑它们并将它们分开。
  • 这闻起来像 XY 问题...但可能想要使用键/值对象,而不是数组。
  • 函数有名字,opdrachtArray[0 .. 9]。

标签: javascript arrays function for-loop


【解决方案1】:

通过将函数放在window 对象上来命名您的函数:

for (i = 0; i < 10; i++) { 
    f = function() { func(i); }); // but see below
    window['opdracht' + i] = f
    opdrachtArray.push(f);
}

但是你有一个更基本的问题。您的所有函数都关闭了i,因此在循环结束后,func 的值总是会被​​调用,换句话说,10。一种解决方案是:

function make_func(i) {
    return function() {
        return func(i); 
    };
}

然后

for (i = 0; i < 10; i++) { 
    f = make_func(i);
    window['opdracht' + i] = f;
    opdrachtArray.push(f);
}

或者

for (i = 0; i < 10; i++) { 
    (function(i) {
        var f = function() { func(i); };
        window['opdracht' + i] = f
        opdrachtArray.push(f);
    }(i));
}

或者只使用func.bind(null, i),它的作用大致相同。

for (i = 0; i < 10; i++) { 
    f = func.bind(null, i);
    window['opdracht' + i] = f;
    opdrachtArray.push(f);
}

【讨论】:

  • 您的代码似乎出错了。 “未捕获的类型错误:未定义不是函数”
  • @OriginDutch:无法重现该错误,也无法想象它会从何而来。
  • 修改后好多了; [新/不同] 程序员很容易错过表达式中的赋值。不过,我仍然不确定他们的 OP 是否需要“在窗口中命名”的功能。这个答案也确实回答了 OP 的“下一个”问题。
【解决方案2】:

如果您希望为每个函数分配一个名称,请使用字典,而不是数组:

    var opdrachtDict = {};
    for (i = 0; i < 10; i++) { 
        opdrachtDict["opdracht"+i]=func.bind(null,i);
    }
    function func(i){
        alert(i);
    }

    opdrachtDict["opdracht3"](); //ok, lets call it and see if you think its still a wrong answer ;)...

【讨论】:

  • “意外令牌 [”@第 3 行
  • 去掉opdrachtArray后面的点,就大功告成了:)
  • "这些必须命名为 'opdracht1' 到 'opdracht10'。"但在这里,它们并没有这么命名,而是保存在一个字典中,以它为关键字。
  • 这个被接受的解决方案也没有修复 OP 代码中的一个重要错误,即所有十个函数都会调用值为 10 的func
【解决方案3】:

您可以将名称和函数存储在一个对象中,并将每个对象推送到数组中:

var opdrachtArray = [];

for (i = 0; i < 10; i++) { 
    var name = 'opdracht' + (i+1);
    opdrachtArray.push({name : name, callback : function() {func(i); }});
}

【讨论】:

    【解决方案4】:

    在全局范围内定义的函数最终只是成为self/window 的属性。即:

    function mr_function(){return 5;}
    self["mr_function"];
    window["mr_function"];
    

    两者(self / window 的属性)都引用了我们定义的函数。我想如果你小心的话,你可以这样命名你的函数。如果您不想将它们设为全局,或者将它们分配给其他对象的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2013-03-10
      • 2021-10-17
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多