我正在使用以下名为 isExpression
的函数来确定某些JavaScript代码是否为表达式:
function isExpression(code) {
try {
new Function("return " + code);
return true;
} catch (e) {
return false;
}
}
它适用于所有测试用例,除了一个 - 它错误地将 FunctionDeclaration
视为 FunctionExpression
并返回 {{ 1}} 而不是 true
。有没有办法解决这个问题,而无需编写解析器?
答案 0 :(得分:0)
由于@FelixKling指出了确定函数是否是声明而不是表达式的唯一方法是检查函数的上下文。但是在REPL(预期isExpression
函数)中没有上下文。因此事情变得更加简单。
如果以code
开头(在开头修剪空格之后),则输入到REPL中的function
只能是一个函数声明。因此,它可以通过正则表达式/^\s*function\s/
进行测试。
@FelixKling指出这样的函数可能仍然是表达式而不是声明,这取决于函数的上下文(即函数是表达式,如果它是non-source element)。但是,传递给此函数的code
保证是源元素。
如果使用条件运算符(例如function f() {} ? x : y
)或使用逗号运算符(例如function f() {}, x
)将此类函数构造用作表达式,则isExpression
仍会返回{ {1}}。但是这样的代码会引发false
。因此,SyntaxError
的以下实现将正确地测试某些代码是否是所有情况的表达式:
isExpression
答案 1 :(得分:-1)
通过检查构造函数返回的值的类型,我们可以确定原始表达式是一个函数。
function isExpression(code) {
try {
return typeof (new Function("return " + code)) () !== 'function';
} catch (e) {
return false;
}
}
警告:将调用字符串中的调用。这可能会减少这种用途。