通常の関数や組み込み関数とは別に、Harmony のスリム アロー関数を区別するエレガントな方法はありますか?
Harmony wikiには、次のように記載されています。
アロー関数は、.prototypeと [[Construct]] 内部メソッドがないという点で組み込み関数に似ています。したがって、 new (() => {}) は TypeError をスローしますが、それ以外の場合、矢印は関数のようです
つまり、次のような矢印関数をテストできます。
!(()=>{}).hasOwnProperty("prototype") // true
!(function(){}).hasOwnProperty("prototype") // false
ただし、テストは、またはなどtrue
の組み込み関数に対しても返されます。setTimeout
Math.min
ソースコードを取得して"native code"
それが.
setTimeout.toSource().indexOf("[native code]") > -1
小さな GitHub プロジェクトnode-is-arrow-functionは、関数のソース コードに対する RegExp チェックに依存していますが、これはそれほどきちんとしたものではありません。
編集: JavaScript パーサーacornを試してみましたが、かなりやり過ぎですが、問題なく動作するようです。
acorn = require("./acorn");
function fn_sample(a,b){
c = (d,e) => d-e;
f = c(--a, b) * (b, a);
return f;
}
function test(fn){
fn = fn || fn_sample;
try {
acorn.parse("(" + fn.toString() + ")", {
ecmaVersion: 6,
onToken: function(token){
if(typeof token.type == "object" && token.type.type == "=>"){
console.log("ArrowFunction found", token);
}
}
});
} catch(e) {
console.log("Error, possibly caused by [native code]");
console.log(e.message);
}
}
exports.test = test;