Javascript 如何正确检查回调函数是否为箭头函数?

Javascript 如何正确检查回调函数是否为箭头函数?,javascript,Javascript,我有一个函数,它接受回调并将this绑定到它。如果使用arrow函数作为回调调用函数,我想抛出一个错误(因为我无法将this绑定到arrow函数) 比如: doSomethingWithMyCallback(function(){}); // ok doSomethingWithMyCallback(() => {}); // should throw an error 如何检查回调函数是否不是箭头函数(即,我可以将此绑定到它)?ES2015标准使函数.prototype.toStrin

我有一个函数,它接受回调并将
this
绑定到它。如果使用arrow函数作为回调调用函数,我想抛出一个错误(因为我无法将
this
绑定到arrow函数)

比如:

doSomethingWithMyCallback(function(){}); // ok
doSomethingWithMyCallback(() => {}); // should throw an error

如何检查回调函数是否不是箭头函数(即,我可以将
绑定到它)?

ES2015标准使
函数.prototype.toString
的定义更加清晰(与ES5.1相比),现在可以确定它是“正常”函数还是使用它的箭头函数

字符串表示必须具有FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、ClassDeclaration、ClassExpression、ArrowFunction、MethodDefinition或GeneratorMethod的语法,具体取决于对象的实际特征

f.toString()
的第一个字符将是
'f'
(如
函数中的
)如果它是一个“普通”函数或一个开括号
('
(如
()=>{}

如果担心函数重写函数的
toString
,可以使用
function.prototype.toString.call(f)
调用它

参考资料:


ES2015标准使
Function.prototype.toString
的定义更加清晰(与ES5.1相比),现在可以确定它是“正常”功能还是使用它的箭头功能

字符串表示必须具有FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、ClassDeclaration、ClassExpression、ArrowFunction、MethodDefinition或GeneratorMethod的语法,具体取决于对象的实际特征

f.toString()
的第一个字符将是
'f'
(如
函数中的
)如果它是一个“普通”函数或一个开括号
('
(如
()=>{}

如果担心函数重写函数的
toString
,可以使用
function.prototype.toString.call(f)
调用它

参考资料:


f.toString()
?。问题的整个前提都是错误的。您可以使用新上下文成功调用arrow函数,arrow函数将做正确的事情并完全忽略它。这就是问题的关键,抛出错误将是愚蠢的。同样,您无法判断是否有人传递了
someFunction.bind(此)
作为参数传递给
doSomethingWithMyCallback
。您是否可以将
作为参数传递给
函数(thisArg){}
(thisArg)=>{}
而不是使用
.bind()
?@zzzzBov我认为他们会将适当的上下文绑定到传递的函数,如果不可能,那么该操作就没有意义。将其视为不改变对象的猴子修补。另请参见-实际上,您不应该这样做。
f.toString()
?。问题的整个前提都是错误的。您可以使用新上下文成功调用arrow函数,arrow函数将做正确的事情并完全忽略它。这就是问题的关键,抛出错误将是愚蠢的。同样,您无法判断是否有人传递了
someFunction.bind(此)
作为参数传递给
doSomethingWithMyCallback
。您是否可以将
作为参数传递给
函数(thisArg){}
(thisArg)=>{}
而不是使用
.bind()
?@zzzzBov我认为他们会将适当的上下文绑定到传递的函数,如果不可能,那么该操作就没有意义。将其视为不改变对象的猴子修补。另请参见-实际上,您永远不需要这样做。“
f.toString()
将带有第一个字符
f
(如
函数中的
)如果它是一个“普通”函数或带有一个开括号(…”FWIW,
(callback=>callback.toString())(foo=>foo*2);
在V8(Chrome)上返回一个以
f
开头的字符串,因为如果您不使用参数,V8不会在单个参数周围添加参数。您最好进行更彻底的检查:。但我也不完全相信这一点,因为它不允许包含参数的默认参数值。@t.J.Crowder噢,天哪,在这种情况下,我认为需要从括号开始s或not“
函数
后面跟一个空格,后面跟一个相等的字符”。但事实上,即使这样也不能由标准保证:-SYeah。我认为如果我们真的需要知道(我有一个用例,但不可能有那么多),它需要启动一个完整的解析器,因为默认参数值可以是任何东西,包括(比如)一个由无限复杂的任意代码填充的函数定义。不过Jordan Harband不同意,他是一个聪明的cookie,所以…现在,如果[[ThisMode]](或[[HomeObject]]有一个访问器,因为我认为方法是唯一没有
原型
属性的函数类型)…我认为[[HomeObject]的访问器]如果它是一个“普通”函数或带有一个开括号(…“FWIW,
(callback=>callback.toString())(foo=>foo*2);
在V8(Chrome)上返回一个以
f
开头的字符串,因为如果您不使用参数,V8不会在单个参数周围添加参数。您最好进行更彻底的检查:。但我也不完全相信这一点,因为它不允许包含参数的默认参数值。@t.J.Crowder噢,天哪,在这种情况下,我认为需要从括号开始s或not“
函数
后面跟一个空格,后面跟一个相等的字符”。但事实上,即使这样也不正确