【问题标题】:Javascript: Calling a function written in an anonymous function from String with the function's names withoout eval?Javascript:从字符串调用以匿名函数编写的函数,函数名称没有eval?
【发布时间】:2011-01-24 20:37:40
【问题描述】:

更新 2:
我真正想问的问题已经在另一页讨论过了。请检查以下条目。
(感谢BobS。)
How can I access local scope dynamically in javascript?


你好。

我已经开始使用 jQuery,并且想知道如何从 String 动态调用匿名函数中的函数。 例如,我有以下功能:

function foo() {
 // Being in the global namespace, 
 // this function can be called with window['foo']()
  alert("foo");
}

jQuery(document).ready(function(){
  function bar() {
    // How can this function be called 
    // by using a String of the function's name 'bar'??
    alert("bar");
  }

  // I want to call the function bar here from String with the name 'bar' 
}

我一直试图找出'window'的对应物,它可以从全局命名空间调用函数,例如window[“foo”]。 在上面的小例子中,如何从字符串“bar”调用函数 bar?

感谢您的帮助。

更新
这就是我想要的:

  1. 定义仅在闭包中使用的函数。
  2. 避免在包含这些函数的闭包中创建对象,以便作为 obj['bar'] 访问。
  3. 避免 eval(如果可能),以便以直接的方式更简单地编写代码(如果存在)。
  4. 通过 URI 参数或任何变量动态确定函数的名称。

作为 Javascript 的新手,我认为 'this' 将与闭包中的 'window' 对应,并尝试编写:

// in the closure
name = 'bar';
this[name]; // undefined ...

失败了(当然……)。
所有这些都是为了追求进一步的懒惰。 Javascript 对我来说是一种新事物,目前我一直在尝试尽可能懒惰地编写代码。

【问题讨论】:

  • Eval 在这里似乎是一个不错的选择。无论如何,您可能会创建嵌套闭包,不是吗?你能解释一下这个场景吗?为什么你有bar 作为字符串?你有没有考虑在你需要的地方定义这些函数?
  • 非常感谢您的评论和建议。为了清楚起见,我在上面的问题板中添加了我想要的内容(编辑下方)。我希望这次我的解释足以被理解。谢谢。

标签: javascript jquery lambda scope namespaces


【解决方案1】:

正如 Kobi 所写,eval 可能是一个不错的选择。或者,有什么理由不这样做

$(function(){
  var localNamespace = {};
  function bar() {
      alert("bar");
  }
  localNamespace['bar'] = bar;
  // Now bar() can be called by, well, localNamespace['bar']
}

更新: 类似的 SO 条目,例如 How can I access local scope dynamically in javascript?,似乎表明如果不使用这两种方法中的任何一种,或者更丑陋的方法,你就会不走运。

【讨论】:

  • 非常感谢您的评论和建议。我很感激。非常感谢您提供的网址。在我在这里发布之前,我尝试找到这种条目,但找不到任何条目。知道不可能做我想做的事,我迈出了一大步。再次非常感谢 BobS。
【解决方案2】:

在您的 ready 函数中:

window.bar = function bar() {
    // ...
}

然后,您可以访问window['bar']

【讨论】:

  • 非常感谢您的及时回复。我很感激。但是,我想在闭包中定义函数栏,而不是在全局范围内,因为我希望函数被限制在特定的函数(情况)中。对不起,我的解释可能还不够。谢谢。
  • 对不起,如果我在这里扮演魔鬼的拥护者,但是:如果你想从闭包外部访问函数,为什么要在闭包内定义它?这不是违背了目的吗?
  • 这里欢迎任何指出:) 谢谢您的评论。我想通过从函数名称的字符串动态调用函数来从闭包内部而不是外部访问函数。但实际上,我也想知道是否可以从闭包外部调用它:)
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多