问题描述
我想看看 JavaScript 中的 typeof
运算符如何知道一个对象是一个函数。
准确地说,我想知道如何获取函数“body”并对其进行逆向工程以确定它期望的参数。 arguments
属性似乎很接近,但仅在评估函数中可用。
除了过时之外,uneval()
或 toSource()
似乎都没有达到我想要的效果。
解决方法
specification 表明:
未实现 [[Call]]
的对象是 object
s
实现 [[Call]]
的对象是 function
s
([[Call]]
是对象的“内部属性” - 它不直接暴露给可交互运行的 JavaScript)
所以任何可以 ()
d 的东西都是 function
。这甚至包括代理,因为代理可以像函数一样被调用。
对于另一个问题:
我想知道如何获取函数“body”并对其进行逆向工程以确定它期望的参数
最简单的方法是将函数转换为字符串并使用正则表达式解析参数列表:
function sum(a,b) {
return a + b;
}
const argList = String(sum).match(/\((.*)\)/)[1];
console.log(argList.split(/,\s*/)); // depending on how complicated the list is
// you may need to make the above pattern more elaborate