有没有一种优雅的方式可以区分Harmony的箭头函数与普通函数和内置函数?
Harmony wiki表示:
箭头函数类似于内置函数,两者都缺少.prototype和任何[[Construct]]内部方法。因此,new (() => {})会抛出TypeError,但除此之外,箭头函数就像函数一样。
这意味着,你可以像这样测试箭头函数:
!(()=>{}).hasOwnProperty("prototype") // true
!(function(){}).hasOwnProperty("prototype") // false
但是该测试对于任何内置函数也会返回true
,例如setTimeout
或Math.min
。
如果你获取源代码并检查是否为"native code"
,它在Firefox中似乎有点可行,但它似乎不是很可靠也不太可移植(其他浏览器实现、NodeJS/iojs):
setTimeout.toSource().indexOf("[native code]") > -1
这个小 GitHub 项目 node-is-arrow-function 依赖于对函数源代码的正则表达式检查,这并不是很简洁。
编辑:我试着使用 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;
Function.prototype.isGenerator
。 - CodeManXcallback
绑定到某个对象并调用它,但无法将callback
绑定到任何对象,我希望抛出一个错误。 - Aleksei Zabrodskiithis
,如果它们是箭头函数,那么它们将无法正常工作。 - Nano Miratusvar g = { f() { return 'x'; } }; g.f.hasOwnProperty('prototype') /* false */
- Mikal Madsen