2016-07-05 97 views
5

由于正常函数和ES6箭头函数之间的上下文差异存在很大差异,我希望能够找出在回调函数fn上收到哪一个函数。找出回调函数是否是ES6箭头

typeofreturnfunction两者。有什么办法可以区分吗?

+3

请不要这样做,如果你正在设计一个API,它应该与这两个工作一致。想想用户重构代码的例子,你是否真的期望函数的签名根据传递的函数而改变?我不会。另外请记住,任何检测方法都可能会失败并显示转换后的箭头函数,因此您的代码将根据运行环境而改变行为。 – loganfsmyth

+0

为什么您想要分辨差异? –

+0

回调的接收器绝对没有区别。您可以简单地调用所有类型的回调。 – Bergi

回答

6

箭头函数不能用作构造函数,而显示typeof arrowFunc.prototypeundefined,而非箭头函数显示“object”。

+0

已确认在Chromebook Chrome 51.0.2704.103中使用'x = function(){return 1;}; Y =(()=> 1); console.log(typeof x.prototype,typeof y.prototype);'yielding' object,undefined' – Paul

+0

它在[this fiddle]中返回'object'(http://www.es6fiddle.net/iqa214ua/) 。 – daniloprates

+0

嗯,我想它不会在Babel上工作,因为它正在编译为正常的函数:/但感谢解决方案,似乎是编译器不是问题时的最佳方式。 – daniloprates

2

您可以使用Function.toString()返回函数源代码的字符串表示形式,然后在字符串中查找箭头(=>)。

var arrowFunc = x => 2 * x 
var regFunc = function (x) {return 2 * x} 

arrowFunc.toString().indexOf("=>") // 2 
regFunc.toString().indexOf("=>") // -1 
+0

不会检测到具有嵌套箭头函数或箭头函数的默认参数值的非箭头函数作为箭头功能? – traktor53

+0

我想它会检测到一个嵌套的箭头函数,在某些情况下可以通过评估'indexOf'的返回来阻止。虽然不确定默认参数值,但他们不使用'=>'他们呢? –

+0

只有当默认值是一个函数并在线定义为一个箭头函数时... – traktor53

相关问题