确定 JavaScript 代码是否为表达式
Determine if JavaScript code is an expression
我使用以下名为isExpression
的函数来确定某些JavaScript代码是否是表达式:
function isExpression(code) {
try {
new Function("return " + code);
return true;
} catch (e) {
return false;
}
}
它适用于所有测试用例,除了一个 - 它错误地将FunctionDeclaration
视为FunctionExpression
并返回true
而不是false
。有没有办法解决这个问题而不必编写解析器?
正如@FelixKling指出的那样,确定函数是否是声明而不是表达式的唯一方法是检查函数的上下文。但是,在 REPL(isExpression
函数适用于该 REPL)中,没有上下文。这样,事情就变得简单了。
REPL 中的code
只有在以关键字 function
开头(在开头修剪空格后)时才能是函数声明。因此,它可以通过正则表达式/^'s*function's/
进行测试。
@FelixKling指出,根据函数的上下文,这样的函数可能仍然是一个表达式而不是一个声明(即,如果函数是非源元素,则该函数是一个表达式)。但是,传递给此函数的code
保证是源元素。
如果要将这样的函数构造用作使用条件运算符的表达式(例如 function f() {} ? x : y
) 或使用逗号运算符(例如 function f() {}, x
),那么isExpression
仍然会返回false
.但是,这样的代码会引发SyntaxError
。因此,以下 isExpression
实现将正确测试某些代码是否是所有情况下的表达式:
var isExpression = function (functionDeclaration) {
return function (code) {
if (functionDeclaration.test(code)) return false;
try {
Function("return " + code);
return true;
} catch (error) {
return false;
}
};
}(new RegExp(/^'s*function's/));
通过检查构造函数返回的值的类型,我们可以确定原始表达式是一个函数。
function isExpression(code) {
try {
return typeof (new Function("return " + code)) () !== 'function';
} catch (e) {
return false;
}
}
警告:将调用字符串中的调用。这可能会使它变得不那么有用。
相关文章:
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 尝试使用Javascript正则表达式来获取“&"分隔文本,无论它是否's是最后一个值
- 是否可以扩展正则表达式元字符的范围
- 是否存在将String转换为可执行的c++表达式的方法
- Webpack:是否可以在编译时评估javascript表达式
- 确定 JavaScript 代码是否为表达式
- 验证数字是否在0.00到20.00之间的正则表达式
- 如何在javascript中测试字符串是否包含带正则表达式的数字
- JavaScript:是否有完全支持查找的正则表达式库
- 在Polymer中,双向绑定与属性表达式是否可能
- Javascript正则表达式,用于检查字符串是否为有效数字
- Go中是否存在与此JS表达式等效的表达式
- 是否可以在自定义指令中使用理解表达式
- 由表达式文本创建的正则表达式是否共享单个实例
- 如何检测正则表达式是否有任何匹配项
- 这个JavaScript正则表达式是否替换空格
- Javascript中带括号的表达式是否返回引用
- 对象数据源的AngularJS ngOptions表达式-是否可以将属性键存储在某个位置
- 如何在脚本中识别正则表达式是否为空