@FelixKlingが指摘したように、関数が式ではなく宣言であるかどうかを判断する唯一の方法は、関数のコンテキストをチェックすることです。ただし、REPL(isExpression
関数の対象)にはコンテキストがありません。したがって、問題はより単純になります。
REPLに入力されるのcode
は、キーワードで始まる場合function
(最初に空白をトリミングした後)にのみ関数宣言になります。したがって、正規表現でテストできます/^\s*function\s/
。
@FelixKlingは、関数のコンテキストによっては、そのような関数がまだ式であり、宣言ではない可能性があることを指摘しています(つまり、関数が非ソース要素の場合、関数は式です)。ただし、code
この関数に渡されるのはソース要素であることが保証されています。
このような関数構造を、条件演算子(eg function f() {} ? x : y
)またはコンマ演算子(eg 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/));