【问题标题】:How do I call a dynamically-named method with for in Javascript如何在 Javascript 中使用 for 调用动态命名的方法
【发布时间】:2013-08-14 07:27:04
【问题描述】:

我有 2 个动态命名的 JavaScript 函数..

function a1(){
   //some codes
}

function a2(){
   //some codes
}

function a3(){
   //some codes
}

上面这些函数肯定是 PHP 生成的..

<?php 
  for($i = 1; $i <= $load_period->count; $i++){ 
?>
  <script type="text/javascript">
  function a<?php echo $i;?>(){
     //javascript functions
  }
  </script>
<?php 
  } 
?>

现在我必须用 for.. 调用这两个函数。

for(var i= 1; i <= 3; i++){
   // here the solution code .. 
   // doesn't work >> a+i+();
}
  • 注意 1:它不适用于“a+i+();” .
  • 注意 2:我不想使用“EVAL”语法

感谢任何解决方案..

【问题讨论】:

标签: javascript jquery dynamic-function


【解决方案1】:

如果函数是全局可访问的,你可以编写

window['a'+i]()

否则,您可以重写代码以将所有函数添加到一个变量:

var f = {
    a1: function() { },
    a2: function() { },
    a3: function() { }
};

...并致电f['a'+i]()

如果你要重写,因为所有函数都由索引命名,你不妨这样写:

var myFunctions = [
  function() { },
  function() { },
  function() { }
];

...并致电myFunctions[i]()。 (当然,正如 Felix Kling 在 cmets 中指出的那样,这里的 i 必须调整为从 0 开始)。

【讨论】:

  • 我最喜欢这种使用“包装”对象的方法。
  • 对不起..但是“window['a'+i]()" 也不起作用.. 我一直在搜索 SO 中的另一个问题,但一无所获
  • @SiegitWisnuA:在这种情况下,您的函数无法全局访问(除非您做错了什么)。如果您无法重写代码、将函数声明移动到全局范围或添加某种包装对象,那么没有eval,您的问题将无法解决。
  • @SiegitWisnuA:经过您的编辑,看起来功能仍然是全局的,但编号是从1X,而不是从03。如果你从 0 开始循环(就像你在 JS 中的代码一样),它会抛出一个错误。
  • @Siegit:那么您必须提供更多信息。关于您发布的代码,window['a'+i]() 应该可以正常工作。
【解决方案2】:

如果它们是全局函数,你可以这样做:

window['a' + i]()

否则,您必须使用eval(坦率地说,这是eval 的完美用例,因为没有其他方法):

eval('a' + i)()

JavaScript 不为您提供通过对象访问当前作用域中的变量的权限(Python 使用 locals()globals() 执行此操作),因此如果您无法重写该代码,eval 是您唯一的选择。

【讨论】:

  • @alexP:不要重复你在互联网上某处读到的建议。 eval 包含在要使用的语言中。 99% 的情况下都有更好的解决方案,但 eval 可以作为最后的手段。
  • 从技术上讲,这将在互联网上的某个地方。只是说。
  • @alexP:我对eval 的使用如何无效?它没有引入安全漏洞。就像我说的,eval 不是禁果。如果您有充分的理由可以使用它,并且因为 JavaScript 没有为您提供通过对象访问当前范围内的变量的方法,eval 是您唯一的选择。
  • eval 就像火一样。一个小孩被告知火灾真的很糟糕。但是当它长大并了解火的工作原理和作用时,它可能能够适当地使用它。 (谁愿意放弃烧烤?)
【解决方案3】:

如果方法在全局范围内,则

for(var i= 1; i <= 3; i++){
    window['a' + i]()
}

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多