Есть ли элегантный способ рассказать о функциях тонкой стрелки Harmony, помимо встроенных функций и?
Harmony wiki утверждает, что:
Функции стрелок похожи на встроенные функции в том, что отсутствует .prototype и любой внутренний метод [[Construct]]. Итак, new (() = > {}) выдает TypeError, но в противном случае стрелки похожи на функции
Это означает, что вы можете проверить функции стрелок, например:
!(()=>{}).hasOwnProperty("prototype") // true
!(function(){}).hasOwnProperty("prototype") // false
Но тест также вернет true
для любой встроенной функции, например. setTimeout
или Math.min
.
Это работает в Firefox, если вы получаете исходный код и проверяете, есть ли он "native code"
, но он не кажется надежным и переносимым (другие версии браузера, NodeJS/iojs):
setTimeout.toSource().indexOf("[native code]") > -1
Небольшой проект GitHub node-is-arrow-function полагается на проверки RegExp на исходный код функции, который не является таким аккуратным.
edit: Я дал парсер 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;