调用以字符串编码的 javascript 函数

Call javascript function encoded in a string

本文关键字:javascript 函数 编码 字符串 调用      更新时间:2023-09-26

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

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

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

eval(functionString)

返回"未捕获的语法错误:意外令牌",以及

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

返回"未定义不是函数"。

这在javascript中可能吗?

提前感谢您的任何回复!

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

console.log(functionString);

返回此字符串:"function (message) {console.log(message);}"

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

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

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

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

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

如果我们改为:

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

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

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

您的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/

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

所以你这样经历它

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

您的functionString是一个看起来像

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

您可以使用字符串串联将该字符串隐藏为立即调用的函数表达式 (IIFE),如下所示。

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

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

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