Javascript 如何以编程方式区分箭头函数和常规函数?

Javascript 如何以编程方式区分箭头函数和常规函数?,javascript,Javascript,a和a之间没有明显的区别 或 函数匿名() 参数:(…) 呼叫者:(…) 长度:0 姓名:“ __原型:() 不过,两者的行为是不同的,有一个有效的用例可以将两者区分开来 如何以编程方式区分箭头函数和常规函数?我能想到的最好方法是使用toString: let isArrowFunction; isArrowFunction = (fn) => { console.log(fn.toString()); return fn.toString().indexOf('fu

a和a之间没有明显的区别

函数匿名()
参数:(…)
呼叫者:(…)
长度:0
姓名:“
__原型:()
不过,两者的行为是不同的,有一个有效的用例可以将两者区分开来


如何以编程方式区分箭头函数和常规函数?

我能想到的最好方法是使用
toString

let isArrowFunction;

isArrowFunction = (fn) => {
    console.log(fn.toString());

    return fn.toString().indexOf('function') !== 0;
};

console.log(isArrowFunction(() => {}) === true);
console.log(isArrowFunction((foo: string) => {}) === true);
console.log(isArrowFunction(function () {}) === false);
见:


嗯,要求有点奇怪,但我做了一些测试:

typeof (() => {}).prototype === "undefined"
真的
,而:

typeof (function () {}).prototype === "undefined"
false
,因此:

function isArrow(x)
{
  return typeof (x.prototype) === "undefined"
}

在这里摆弄:

所以基本上可以知道是匿名函数还是箭头函数被用作参数?我不认为有任何类似的东西可用,但可能有?你的答案可能在this object中,因为一个常规函数将this object分配给它自己,但是一个arrow函数将this object分配给任何在arrow function之外的this object为什么在运行时需要它?“这两个函数的行为是不同的”-这是一样的:它们都接受参数并返回结果。@zerkms这只是定义函数行为的两个特性。正如其他人所指出的,还有更多,例如,箭头函数中的词法
this
。@GajusKuizinas这是对的,但在运行时这对您来说并不重要。作为客户机,使用函数唯一能做的就是传递参数并检索结果。从这个角度看,它们的行为都是一样的。你将把这个应用到什么实际案例中?我可以在Chrome中复制这个,尽管我不理解它是如何工作的,特别是考虑到
(()=>{}).call
和其他
函数
原型方法的存在。我真的不知道,只是转储了一些匿名函数和一些箭头函数并检查了它们之间的差异。根据:
Arrow函数类似于内置函数,因为它们都缺少.prototype和任何[[Construct]]内部方法
,但这并不能解释为什么匿名函数有一个.prototype
对象。getPrototypeOf(()=>{})=function.prototype
请注意,这是真的。是的,它们似乎是(根据ES6 wiki)要缺少
.prototype
字段,它们实际上有一个
\uuuu proto\uuuu
。我真的不太喜欢javascript来解释它为什么会发生,只是通过实验发现,really@jcl-箭头函数不是构造函数,因此它们不需要公共原型属性。但是因为它们是函数,所以它们的内部
[[Prototype]]
是Function.Prototype,可以为它们分配公共Prototype属性。因此,虽然通过查找其公共原型来检查箭头函数可能会在某些时间甚至大部分时间工作,但这并不能保证。这一切都在规范中,只是需要一些时间才能完成……可以找到一个更完整的实现,还有一个@ljharb的替代实现
function anonymous()
    arguments: (...)
    caller: (...)
    length: 0
    name: ""
    __proto__: ()
    <function scope>
let isArrowFunction;

isArrowFunction = (fn) => {
    console.log(fn.toString());

    return fn.toString().indexOf('function') !== 0;
};

console.log(isArrowFunction(() => {}) === true);
console.log(isArrowFunction((foo: string) => {}) === true);
console.log(isArrowFunction(function () {}) === false);
(function () {}).toString();
"function () {}"

(() => {}).toString();
"() => {}"
typeof (() => {}).prototype === "undefined"
typeof (function () {}).prototype === "undefined"
function isArrow(x)
{
  return typeof (x.prototype) === "undefined"
}