【问题标题】:Call javascript function encoded in a string调用以字符串编码的 javascript 函数
【发布时间】:2014-12-05 21:09:05
【问题描述】:

如果我将一个函数放入这样的字符串中:

var functionString = function (message) {
    console.log(message);
}.toString();

有没有办法将字符串转换回函数并调用它? 我试过了

eval(functionString)

返回“Uncaught SyntaxError: Unexpected token”,并且

functionString.call(this, "HI!");

返回“未定义不是函数”。

这在 javascript 中是否可行?

提前感谢您的回复!

编辑:这个问题的重点是该函数已使用 toString() 转换为字符串。所以

console.log(functionString);

返回这个字符串: “函数(消息){console.log(消息);}”

我可以将字符串转换回函数并调用它吗?这就是我要解决的问题。 谢谢!

【问题讨论】:

  • 如果您准确地发布字符串中的内容会有所帮助。
  • 你可以在函数内部执行“return message.toString()”
  • 有可能,是的,但你到底想做什么?
  • epascarello,我想将字符串转换回函数。布赖恩,我不想调用现有函数。我想把整个字符串转换成一个函数。

标签: javascript function eval tostring


【解决方案1】:

你快到了,但你错过了一些东西。

当我们在你的函数上调用 toString() 时,我们得到

"function (message) {
    console.log(message);
}"

然后我们可以对其进行评估。但是,我们只是在这里创建了一个匿名函数对象;我们将无法调用它!

如果我们改为:

var functionString = "var restoredFunc = " + function (message) {
    console.log(message);
}.toString();

然后我们可以执行以下操作

eval(functionString);
// prints "hello!" to console
restoredFunc("hello!");

【讨论】:

    【解决方案2】:

    您的functionString 正好包含字符串

    "function (message) { console.log(message); }"

    按原样评估它会导致 JavaScript 引擎语法不正确(此函数没有名称)。 JavaScript 需要像 function <name>(<params>) { } 这样的构造。或者,您可以使用匿名函数(即不存在名称),但只能作为参数或在评估表达式的上下文中。最小的典型评估表达式是 (function() {})() 如果你想花哨,!function() {} 也可以 - 前面的感叹号将其转换为布尔表达式,需要在否定输出之前进行函数评估。

    因此,在您的示例中,这将起作用:

    eval("("+functionString+")('abc')");

    因为那时你会进行匿名函数调用 - JavaScript 可以接受的东西。

    或者,您也可以只使用括号,然后您需要将结果分配给您以后可以使用的东西:

    var foo = eval("("+functionString+")");
    foo('ddd');
    

    这里有一个小证据/操场来了解它: http://jsfiddle.net/Exceeder/ydann6b3/

    【讨论】:

    • 工作,谢谢!你能告诉我我应该用谷歌搜索什么来了解更多信息,例如 functionString 的 +-wrapping 吗?
    • @user1840267 对于 eval(),打印您评估的实际字符串总是有意义的,然后将其复制粘贴到您选择的编辑器中的空 .js 文件中,看看它在语法上是否正确.
    • 啊,我明白了,他只是将函数包装在括号中!明白了,谢谢!
    【解决方案3】:

    是的,它在 JavaScript 中是可能的,但你不能在没有赋值的情况下使用 eval 匿名函数

    所以你就这样经历它

    var functionString = function (message) {
        console.log(message);
    }.toString();
    
    eval("myfunction =" + functionString)
    
    myfunction("Hello World!")
    

    【讨论】:

      【解决方案4】:

      你的functionString 是一个字符串,看起来像

      "function (message) {
          console.log(message);
      }"
      

      您可以使用字符串连接将该字符串转换为立即调用函数表达式 (IIFE),如下所示。

      (function (message) {
              console.log(message);
      })("HI!");
      

      然后评估它。以下是 Chrome 的 JavaScript 控制台的结果:

      eval('(' + functionString + ')("HI!")')
      HI!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        相关资源
        最近更新 更多