如何在javascript中的函数内运行字符串作为函数?

时间:2016-03-16 02:29:58

标签: javascript

这个问题的一个例子是这样的

var bar = (function(){

   function foo(){
      alert("foo");
   }

   function test(){
     var f = "foo";

     // I want to run  f() to run the function foo
   }
})();

如果函数在全局范围内,我可以使用window["foo"]()或命名空间window["namespace"]["foo"]()来运行它,但是如何在示例中运行它?我不想使用eval()

我想要的一个非常清楚的例子是这样的:

var fns = ['a','b','c'],
    bar = (function(){

      function a(){
          alert("a");          
      }

      function b(){
          alert("b");          
      }

      function c(){
          alert("c");          
      }

      function test(array){
         for(var i;i<array.length;i++){
            //I want to run the functions that is on the array
            // something like window[array[i]]() if function is in the global scope

         }
       }

      return {
         test : test
      }
    })();

    bar.test(fns);

2 个答案:

答案 0 :(得分:1)

您可以创建一个本地对象来引用该函数,然后像使用window示例一样访问其属性。

var bar = (function(){

   function foo(){
      alert("foo");
   }

   var obj = {
     foo: foo
   };

   function test(){
     var f = obj["foo"];
     f();
   }
  
   test();
})();

这与您在不使用eval的情况下进入本地范围的距离非常接近。

答案 1 :(得分:-1)

您可以使用此运算符创建对象OR fn,并使其成为具有新构造函数的函数。

创建对象。

https://jsfiddle.net/0Lyrz6rm/6/

var bar = {
foo: function(){
      alert("foo");
   },
test: function(){
     var f = "foo";
         return f;
   }
}
bar["foo"]();
console.log(bar["test"]());

另一种替代方法是使用构造函数定义函数并进行少量修改。

https://jsfiddle.net/0Lyrz6rm/4/

   var bar = function(){
this.foo = function(){
      alert("foo");
   };
this.test = function(){
     var f = "foo";
            return f;
     // I want to run  f() to run the function foo
   }
this.test2 = {
        f: "foo"
    }
}
var f = new bar();
f["foo"]();
console.log(f.test());
console.log(f.test2.f);