- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个函数,该函数将对象作为参数,并使用存储在该对象中的数据执行操作。我想做的一些事情涉及该对象中的函数。我想将它们中的大部分绑定(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(') => {');
对我们来说不幸的是,圆括号和花括号实际上对于箭头函数都是可选的,它们甚至不需要任何空格。因此,理想情况下,我们需要一些能够在 foo
为 x=>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/
下面是我用来制作 1px 文本描边轮廓的代码。但是如何使轮廓变粗呢?如果我只是用“5px”替换所有“1px”,结果看起来很疯狂。 HTML Hello! CSS .element { color:
我是一名优秀的程序员,十分优秀!