【问题标题】:How to define a javascript function with a name equal to a string如何定义名称等于字符串的javascript函数
【发布时间】:2012-06-19 00:03:21
【问题描述】:

假设给定一个字符串,我想用该字符串的名称定义一个函数。我该怎么做?

更新:

我忘了提到我不想将匿名函数设置为属性,因为我还想从函数内部动态获取函数的名称,即。 arguments.callee.name

【问题讨论】:

  • 如果你已经得到了这个名字,为什么还要再从arguments.callee.name获取那个名字?
  • @JamesAllardice 因为我正在动态重写Element 原型的removeChild javascript 方法
  • 我不完全清楚您要达到的目标。您问题中的一些代码可能会有所帮助。但作为旁注,不要忘记 arguments.callee 已被弃用,并在严格模式下引发语法错误。

标签: javascript metaprogramming


【解决方案1】:

如果您声明函数,请使用eval()。只需键入您尝试执行的参数的字符串表示形式,例如:

eval("function name(){alert('a');}");

然后您可以按照常规约定调用该方法,name();

如果您已经有了函数名并且想用字符串表示来调用该函数,您可以使用eval() 方法,尽管它并不总是性能最佳。你会得到这个:

var fnName = "functionName";
var params = "param1";
var fnNameWithParams = "functionName("+params+")";
eval(fnNameWithParams);

更好的方法可能是:

var fnName = "functionName";
var params = "param1";
var fnToCall = window[fnName];
fnToCall(params);

【讨论】:

  • “它并不总是最适合性能”......它几乎不是最适合任何东西。不幸的是,我不知道 OP 是否有任何方法可以在没有它的情况下实现他们想要实现的目标(至少在没有更多信息的情况下不会)。
【解决方案2】:

像这样:

var functionName = "myfunction"
window[functionName] = function() {
    // your function here
} 

根据要求,也许这样的事情会起作用:

var myFunctionGenerator = function(name) {return function(message) {
    alert("hi, this is a function named '" + name + "'.  The parameter passed is '" + message + "'.");
}}

var myFunction = myFunctionGenerator('some function name');
myFunction('a parameter');
// hi, this is a function named 'some function name'.  The parameter passed is 'a parameter'.

【讨论】:

  • 啊,我忘了提到我不想将匿名函数设置为属性,因为我还想从函数内部动态获取函数的名称,即。 arguments.callee.name
  • @user730569 请记住callee 和严格模式...不太好。
  • @DaveNewton 还有其他选择吗?
  • @user730569 - 替代方法通常是使用命名函数表达式。但是,如果没有更多关于你实际想要达到的目标的信息,我认为很难提供适当的帮助。
  • @DaveNewton dbaseman 的第二个解决方案就像一个魅力......它不使用callee,所以这是双赢的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多