【问题标题】:How do you change a function name inside a for loop in javascript如何在 javascript 的 for 循环中更改函数名称
【发布时间】:2013-03-07 21:49:33
【问题描述】:

我想将 for 循环中的函数名称更改为类似的名称。

<script>
for (var x=1;x<10;x++){
function name_x(){
   code
}
</script>

因此,生成了 10 个名称为 name_1、name_2 等的函数。

谢谢

编辑:

这就是我需要一个 for 循环来创建 5 个函数 id_1、id_2、id_3、id_4、id_5

<html>
<head>
<script>
function id_1(a){
var id = document.getElementById(a);
if (id.innerHTML==="innerHTML2"){
    id.innerHTML="innerHTML1";
}
else if (id.innerHTML==="innerHTML1"){
    id.innerHTML="innerHTML2";
}
}
</script>
</head>
<body>
<a id="id1" href="javascript:id_1('id')">innerHTML1</a>
<a id="id2" href="javascript:id_2('id')">innerHTML1</a>
<a id="id3" href="javascript:id_3('id')">innerHTML1</a>
<a id="id4" href="javascript:id_4('id')">innerHTML1</a>
<a id="id5" href="javascript:id_5('id')">innerHTML1</a>
</body>
</html>

【问题讨论】:

  • 你为什么要这样做?创建完这 10 个函数后你会做什么?
  • 生成许多类似命名的函数名似乎是一种非常强烈的代码气味。你能稍微备份一下,解释一下你想要完成的事情的大局吗?例如,数组可能有更好的方法。
  • 嗯,我想要完成的就是这个。当我点击一个链接时,它对应一个函数,我希望每个函数做不同的事情。所以如果我有 10 个链接,我想要 10 个函数。
  • @user2145975:你为什么不使用匿名函数?
  • @user2145975:如果这 10 个链接做了 10 件完全不同的事情,那么就给他们 10 个与他们的行为相对应的不同的合理名称。如果它们非常相似并且不同之处取决于索引号,那么让所有 10 个链接调用完全相同的函数,并使用控制流逻辑和函数参数处理差异。例如,您可以调用handleLink(this) 来传递对源链接的引用,并根据点击的链接进行略微不同的处理。

标签: javascript function for-loop


【解决方案1】:

这看起来很邪恶,但如果你在浏览器中,你可以使用window 作为全局对象。否则,定义一些对象来容纳方法:

var obj = {}, x;
for (x = 1; x < 10; x++) {
    obj['name_' + x]() { /* code */ }
}

然后您可以通过obj.name_1()obj['name_1']() 拨打电话。

【讨论】:

    【解决方案2】:

    您可以改为创建一个数组函数:

    var fs = [];
    for (var x = 1; x < 10; x++){
        fs.push( function() {
           /* code */
        });
    }
    fs[1](); // call second function
    

    您可以改用对象,但我不建议这样做。

    【讨论】:

    • +1 这是个好主意;但正如@ExplosionPills 所证明的那样,对是否可以完成 OP 的请求的问题说“不”是不正确的。
    • 删除了错误的陈述。我有时会忘记,您实际上可以修改 window 以获得一些有趣的东西。
    • @user2145975:将您的尝试(实际代码!)添加到您的问题中。
    【解决方案3】:

    由于您的代码应直接应用于您单击的链接,因此您可以使用this 传递对链接的引用。此外,javascript 代码需要放在onclick,而不是href。如果你需要一个href 值来让它看起来像一个链接,你可以使用#

    <a id="id1" href="#" onclick="javascript:swapContents(this);">innerHTML1</a>
    

    然后你可以使用传入的参数作为元素的引用(使用有意义的函数名是一种很好的编程习惯,所以我将函数重命名为swapContents):

    function swapContents(el){
        if (el.innerHTML === "innerHTML2"){
            el.innerHTML = "innerHTML1";
        } else if (el.innerHTML === "innerHTML1"){
            el.innerHTML = "innerHTML2";
        }
    }
    

    此外,根据 HTML 规范,所有元素都应具有唯一的 id 值。如果您希望它们以某种方式统一,请给它们相同的classname,或自定义的组成属性:

    <a id="id1" class="id" href="#" onclick="javascript:swapContents(this);">innerHTML1</a>
    <a id="id2" class="id" href="#" onclick="javascript:swapContents(this);">innerHTML1</a>
    <a id="id3" class="id" href="#" onclick="javascript:swapContents(this);">innerHTML1</a>
    <a id="id4" class="id" href="#" onclick="javascript:swapContents(this);">innerHTML1</a>
    <a id="id5" class="id" href="#" onclick="javascript:swapContents(this);">innerHTML1</a>
    

    演示:http://jsfiddle.net/V6yG9/

    【讨论】:

    • 这是有道理的,谢谢,但是如果我不希望它重定向 url(添加 #)。
    • @user2145975:# url 无效,这就是为什么它通常用于仅 javascript 链接。如果您不喜欢它将# 添加到您当前网址的末尾,您可以使用href="javascript:;",这是另一个无操作网址:jsfiddle.net/V6yG9/1
    • 如果我想让每个链接做不同的事情怎么办?例如 $.get('code1.php') 一个和 $.get('code2.php') 另一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多