Javascript:从String中调用一个用匿名函数编写的函数,函数的名称是不是eval?

时间:2010-03-08 05:14:03

标签: javascript jquery lambda scope namespaces

UPDATE2:
我真正想问的问题已经在另一个页面中提出过争论。请检查以下条目。
(感谢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”调用功能栏?

感谢您的帮助。

更新
这就是我想要的:

  1. 定义仅在闭包中使用的函数。
  2. 避免在包含这些函数的闭包中创建一个Object,以便作为obj ['bar']进行访问。
  3. 避免使用eval(如果可能)以便以简单的方式(如果存在)更简单地编写代码。
  4. 通过URI参数或任何变量动态确定函数的名称。
  5. 作为Javascript的新手,我认为'this'会在闭包中与'window'对应,并尝试写作:

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

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

2 个答案:

答案 0 :(得分:3)

正如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?,似乎表明你没有使用这两种方法中的一种或者甚至更丑的东西都不运气。

答案 1 :(得分:2)

ready功能中:

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

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