gpt4 book ai didi

javascript - 我如何判断一个函数对象是否是用粗箭头表达式创建的?

转载 作者:行者123 更新时间:2023-11-29 18:57:07 24 4
gpt4 key购买 nike

我正在创建一个函数,该函数将对象作为参数,并使用存储在该对象中的数据执行操作。我想做的一些事情涉及该对象中的函数。我想将它们中的大部分绑定(bind)到各种对象,但这不适用于使用 fat arrow syntax 创建的任何函数.所以,我想对他们做一些不同的事情。我如何区分它们?

注意:我知道普通函数有一个原型(prototype),但用粗箭头语法制作的函数没有,但我不能使用它,因为用 method syntax 制作的函数也没有原型(prototype),但它们可以绑定(bind),所以我想像对待其他函数一样对待它们。

最佳答案

你可以使用 Function#toString()检查函数的源代码,看看它是否被定义为箭头函数。

const foo = () => {};
const fooStr = Function.prototype.toString.call(foo);
const isArrow = fooStr.includes(') => {');

请注意,上面的实现对于大多数用例来说可能过于幼稚,因为它有一些误报和漏报。对于初学者,如果 foo 是一个包含箭头函数的普通函数(或者在它内部的任何地方都有那个特定的字符串),则 isArrow 将为 true ,比如评论等)

我们可以通过尝试特别匹配函数定义的头部来对此进行改进。下面,我通过搜索花括号 { 的第一次出现来执行此操作,这对于箭头函数和非箭头函数都是通用的。

const foo = () => {};
const fooStr = Function.prototype.toString.call(foo);
const curlyIndex = fooStr.indexOf('{');
const head = fooStr.substring(0, Math.max(curlyIndex, 0));
const isArrow = head.endsWith(') => {');

对我们来说不幸的是,圆括号和花括号实际上对于箭头函数都是可选的,它们甚至不需要任何空格。因此,理想情况下,我们需要一些能够在 foox=>x 时起作用的东西,例如。

const foo = x=>x;
const fooStr = Function.prototype.toString.call(foo);
const curlyIndex = fooStr.indexOf('{');
let isArrow = true;
if (curlyIndex >= 0) {
const head = fooStr.substring(0, curlyIndex);
isArrow = head.replace(/\s/g, '').endsWith('=>{');
}

上面的实现是半途而废,但当 foo 类似于 x => x + '{' 时,它仍然有误报。还有其他陷阱,所以不要以为它就此结束。字符串分析很难,尤其是当语法是可选的时。

您可以使用像 Esprima 这样的库, Acorn , 或 Cherow , 来解析字符串并更完美地识别代码是否是箭头函数,但这对你来说可能有点过头了。

为了让您了解它的外观,下面是 Cherow demo 的输出当我输入一个空箭头函数时:

{
"type": "Program",
"sourceType": "script",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "ArrowFunctionExpression",
"body": {
"type": "BlockStatement",
"body": []
},
"params": [],
"id": null,
"async": false,
"generator": false,
"expression": false
}
}
]
}

关于javascript - 我如何判断一个函数对象是否是用粗箭头表达式创建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com