【问题标题】:JavaScript - Call a function by a string [duplicate]JavaScript - 通过字符串调用函数[重复]
【发布时间】:2014-12-16 03:56:27
【问题描述】:

这个问题已经以不同的方式存在,但我的代码大多不同,所以我没有从其他答案中得到解决方案。这是一个示例代码:

http://jsfiddle.net/e52n28xs/

我想像这样启动函数:

var test1 = {
    start: function() { }
};
var fn = 'test1';
fn.start();

我知道以下工作,但我需要字符串选项。

test1.start();

也许这不可能?

【问题讨论】:

标签: javascript


【解决方案1】:

你可以用eval()函数来做

var test1 = {
    start: function() { }
};
var fn = 'test1';
eval(fn).start()

DEMO

【讨论】:

  • 为什么要投反对票???解释!
  • 如果答案是eval,你就没有看懂这个问题。附言不是反对者。附言我知道有些地方eval 是唯一的选择,但这不应该是其中之一。
  • 不是我,而是eval is evil,我们从不喜欢它:)
  • 这个答案很明显,大家都知道:)
【解决方案2】:

根据您运行的函数中this 的值,其中任何一个都可以工作:

window['test1'].start();

或者

this['test1'].start();

显然,你可以对函数名本身做同样的事情,例如:

test1['start']();

this['test1']['start']();
// same as:     var test1 = this['test1']; test1['start']();

如果你想让整个东西都是字符串,那么:

eval('test1.start()');

如果您使用var,这也可以,在以前的字符串版本中,您必须有一个容器对象才能查询。

【讨论】:

  • 使用它你应该this.test1 = ...;,而不是var test1 = ...;
  • 有什么特别的原因我应该使用test['start']() 而不是test.start()?您是否建议致电window['alert']("Hi") 发出警报?
  • 我不建议大多数时候这样做,除非函数名是保留字并且你需要支持IE8,或者由于某种原因函数名本身是动态的(你可以放任何字符串那里的变量不仅仅是静态字符串)。我只是想如果 OP 想要对象是字符串,他可能也想要这个函数。
  • @torazaburo,如果字符串参数中有函数名,例如
  • 如果是这样,有两个选择:eval('test1').start(),或者你需要一些容器来包含所有对象,如var stuff = { test1: test1, tree52: tree52 };,然后你可以使用类似stuff['test1'].start()的东西。答案中解释了这两个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2013-06-03
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多