评估函数表达式

时间:2019-05-08 11:54:25

标签: javascript eval

虽然我期望这段代码

f = open('flux_ratios.csv', 'ab')
np.save(f, 'a',savearray)
f.close()

在控制台中打印'1',出现语法错误var a = eval("function() { return 1; }"); console.log(a()); 。我在这里做什么错了?


我正在使用允许在配置中定义javascript函数的框架,因此除了使用eval之外,我别无选择。

4 个答案:

答案 0 :(得分:4)

function关键字在Javascript中含糊不清:它可以启动函数声明(语句)或函数文字(表达式)。当在语句位置遇到function时,解析器会自动选择声明而不是表达式。由于eval需要一个语句,因此这会使您的代码无效-声明需要函数名称。您可以提供一个名称:

eval('function foo() {...}')

或强制解析器进入表达式模式

foo = eval('( function () {...} )')

在这种情况下,function将被视为文字。

这与{}基本上是相同的故事,可以是块或对象文字。像eval('{1:2}')之类的东西将因完全相同的原因而失败(陈述优先于表达式)。

答案 1 :(得分:2)

问题是您有一个function declaration,并且需要一个名称。供参考,这是一个函数声明

function myFunc() { console.log("executed") } //<-- declaration

myFunc(); //<-- execution

期望拥有的是一个未命名的函数表达式

var myFunc = function() { console.log("executed") }
//expression ^------------------------------------^

myFunc(); //<-- execution

或者对于您没有分配给变量的真正未命名的函数,可以使用IIFE

// ( <-- brackets around the expression --> )
(            function() { console.log("executed") } )()
//expression ^------------------------------------^  ^^
//execution  ----------------------------------------^^

但是,在JavaScript中,以function关键字开头的独立语句将被视为声明,并且如果没有名称,则该语句无效。

但是,您可以通过将表达式放在方括号中以使其能够被解析器接受,从而解决该问题。

//brackets    v--------------------------v
var a = eval("( function() { return 1; } )");
//              ^----------------------^ function expression
console.log(a());

答案 2 :(得分:1)

由于注释是100%正确,即函数必须包含名称或必须初始化为匿名函数,因此可以解决您的问题。

如果要通过文本创建函数,可以使用函数构造函数

new Function ([arg1[, arg2[, ...argN]],] functionBody)

有关更多信息,请查看https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function

答案 3 :(得分:1)

您不能以这种方式混合使用函数声明和函数表达式。您必须在text = "_baba _dede" print [word[1:] + word[0] for word in text.split()] 内进行完整的声明或表达式。

eval()

这将起作用,因为我们为函数声明指定了适当的名称 eval("function a() { return 1; }"); console.log(a());,然后在全局范围内调用此函数。

a

这也将起作用,因为将其分配给变量 eval("var a = function() { return 1; }"); console.log( a() );的函数表达式现在是要求值的一部分。然后我们可以在其作用域内调用该函数。

如果有替代方法,则实际上都不应该使用这些方法。 最常见的替代方法是使用a

new Function();

这可以达到相同的最终结果,并且比使用var a = new Function( 'return 1;' ); console.log( a() );更为安全。

如果这是框架允许定义额外的javascript函数的唯一方法,我会感到惊讶。我猜想,由于它位于某些配置中,因此它带来的安全性问题不如公共代码重要。但是我会重读该框架的文档,以仔细检查这是唯一的选择。