【问题标题】:Javascript to parse string with 'function'用'function'解析字符串的Javascript
【发布时间】:2012-10-11 14:29:29
【问题描述】:

我有以下字符串需要使用 JS 解析。

function () {\n     MyClass.prototype.doSomethingFunction();\n       5-6 lines of coding\n  }

我尝试解析它,修剪空格和换行符,但对我没有任何帮助。请告诉我如何从上面的字符串中获取函数名称(doSomethingFunction)。

我是如何得到这个字符串的:

我有一个存储我的函数的队列。稍后我的代码会从这个队列中选择一个函数(这里有一些逻辑)并执行它们。它对我来说完全没问题。但我只想打印出函数的名称!就像 '(classOBJ.myFunctionsQueue[n])()' 用于执行存储在 myFunctionsQueue 数组中的第 n 个位置的函数。有道理还是我在这里做错了什么?

谢谢 曼

【问题讨论】:

  • 为什么需要在 JavaScript 中解析 JavaScript?
  • 你的意思是获取一个没有名字的函数名吗?
  • 你不能用函数名和一个单独的属性来填充你的队列吗?即["doSomethingFunction", "function () {\n... "].
  • MyClass.prototype.doSomethingFunction() 是整个命名空间。我只想要 doSomethingFunction() 。这有意义吗?
  • 您的解决方案听起来很脆弱。您的总体目标是什么,也许总体上有更好的方法?

标签: javascript parsing


【解决方案1】:

尝试像这样匹配的 reg 表达式

var str = "function() {\n MyClass.prototype.doSomethingFunction();\n 5 - 6 lines of coding\n}";

var matches = str.match(/prototype\.(.+?)\(\)/);
if(matches){
    alert(matches[1]);
}

【讨论】:

  • gr8... 这就是我要找的东西。非常感谢二极管。顺便说一句,使用数组来存储您的函数是好设计还是坏设计?从上面的 cmets 听起来我在做坏事!!!
  • @MANN:数组对于队列来说似乎是合理的,但是将函数存储为字符串邪恶的。
【解决方案2】:

我认为这不是您的应用程序的正确方法,但当前的问题可以通过类似的方式解决

myFunctionString.split("\n").reduce(function(map, line) {
    if (/^\s*[^\s[\]]+\(\);?\s*$/.test(line))
        map.push(line.split(".").pop().replace(/\(\);?\s*$/, ""));
    return map;
}, []);
// returns an array of invoked method names

【讨论】:

  • 我在做什么:var myObj = new MYClass(); var queueOBJ = new QUEUECLASS(几个参数); queueOBJ.addTest(myObj.doSomethingFunction);这个设计好吗,或者......甚至@bfavaretto 认为它还可以。你介意告诉我我在这里做错了什么吗?
  • 你不能真正依赖字符串中的某些代码,它可能太容易变成不可解析的东西。另外我不完全理解您的用例,为什么要获取在某个函数字符串中调用的第一个方法的属性名称?
【解决方案3】:

首先,如果您正在执行存储为字符串的函数,您可能做错了(使用evalnew Function(body))。你不能使用一个对象作为队列,函数名作为键,函数引用(不是字符串)作为值吗?像这样:

var queue = {
    "funcName" : function() { /* do something */ },
    "otherFunc" : function() { /* do something else */ }
    /* etc. */
};

然后您可以打印所有名称并从循环中执行所有函数,例如:

for(var key in queue) {
    console.log(key); // function name
    queue[key]();     // execute function
}

【讨论】:

  • 我怀疑我将函数存储为字符串。让我告诉你我在做什么: var myObj = new MYClass(); var queueOBJ = new QUEUECLASS(几个参数); queueOBJ.addTest(myObj.doSomethingFunction);这个设计好还是...
  • 看起来不错。你说这是一个字符串,需要解析,因此我的回答。
猜你喜欢
  • 2020-06-21
  • 1970-01-01
  • 2011-12-24
  • 2011-07-09
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多