JavaScript函数内部的变量名称调用函数

时间:2014-01-13 10:55:20

标签: javascript function object dynamic

当其名称在变量中时,我很难调用另一个函数内的函数:

var obj = {}

obj.f = function() {
  var inner = {
    a: function() {
      function b() {
        alert('got it!');
      }
      b(); // WORKS AS EXPECTED
      x = 'b';
      [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc.
    }
  }
  inner.a();
}

obj.f();

我尝试为[x]()添加不同范围路径的前缀,但到目前为止还没有成功。搜索现有答案并未发现任何问题。如果this[x]()直接放在对象内部,它可以与b()一起使用。由于b()中的范围可变,我希望将function a()保留为function a()内的函数,否则我需要将许多参数传递给b()

//// 重复问题:Quentin在这个帖子imo中提供了一个更优雅的答案。

6 个答案:

答案 0 :(得分:16)

使用匹配变量名称的字符串,没有合理的方法来访问任意变量。 (对于一个非常糟糕的方法,请参阅eval)。

  

[x](); //不工作

您正在尝试将数组作为函数调用

  

不需要this[x]()

该函数不是inner对象的属性。

  

window[x]()

由于它不是全局的,因此它也不是窗口对象的属性。


如果需要根据字符串变量的值调用函数,则在对象中组织函数并从中访问它们。

  function b() {
    alert('got it!');
  }
  var myFunctions = {
      b: b
  };
  x = 'b';
  myFunctions[x](); 

答案 1 :(得分:3)

试试这个。目前,您将字符串分配给变量x,而不是函数变量。

 x = b;
 x();

答案 2 :(得分:2)

问题在于您的作业

使用x = b代替x = 'b'来分配函数对象,因为后者只是将字符串赋值给x。

修复作业后,您可以调用该函数

x();
a.x();
a[x]();

答案 3 :(得分:2)

您应该为该函数创建数组,然后使用变量中的name进行访问,如下所示:

var obj = {}

obj.f = function() {
  var inner = {
    a: function() {
      // set up the possible functions:
      var myFuncs = {
              b: function b() {alert('got it!');}
              };
      //b(); // WORKS AS EXPECTED --> commented this code
      x = 'b';
      myFuncs[x]();    
    }
  }
  inner.a();
}

答案 4 :(得分:1)

函数声明 b将在分配为a匿名函数表达式的闭包中捕获。

  1. 在闭包中使用var时,没有(在 JavaScript 中可用) Object ,它被赋予类似于{{ 1}}在全局范围中。
  2. 有效地编写函数声明window 函数的名称
  3. 如果您确实想要通过 String 访问变量(即var),则需要创建一个 Object ,其中包含{{1}与您为b所做的相似,或者(并且可能危险地)依靠ba转换为eval

    如果您无法提前创建整个对象,则可以使用此格式

    "b"

答案 5 :(得分:1)

让我们说你的代码是这样的:

//instead of x = 'b'
x = function(){}

然后你的解决方案可能是这样的:

var obj = {}

obj.f = function() {
  var inner = {
    a: function() {
      function b() {
        alert('got it!');
      }
      b(); // WORKS AS EXPECTED
      //you can define it as a variable
      var x = function(){};
      //and call it like this
      x();

      //or define it like this
      this[x] = function(){};
      //and call it like this
      this[x]();

      //but you are creating an array [x] which is not a function
      //and you are trying to call an array????
      [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc.
    }
  }
  inner.a();
}

obj.f();