// 撸代码
function tq(a, b, c) {}
tq.toString();
// "function tq(a, b, c) {}" 那么剩下的事情就是通过正则匹配解析出圆括号里面的内容了,简单吧
前人已经写的几种获取函数形参的方法
get-parameter-names 推荐使用
//https://github.com/goatslacker/get-parameter-names/blob/master/index.js
// 看不懂正则的,可以上https://regexper.com
var COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var DEFAULT_PARAMS = /=[^,]+/mg;
var FAT_ARROWS = /=>.*$/mg;
function getParameterNames(fn) {
var code = fn.toString()
.replace(COMMENTS, '')
.replace(FAT_ARROWS, '')
.replace(DEFAULT_PARAMS, '');
var result = code.slice(code.indexOf('(') + 1, code.indexOf(')'))
.match(/([^\s,]+)/g);
问题
如何获取一个函数形参?我们都知道通过arguments可以获取运行时的实参值,但是形参值怎么获取,如果我们对toString的用法了解,这个问题就好解答了
toString
Function.prototype.toString里有一句话说,在一个函数上直接调用toString方法,会以字符串形式返回这个函数的源码。这里有个重要信息,通过调用toString() 方法可以反编译解析出函数源码,多么强大简单的功能。
前人已经写的几种获取函数形参的方法
function getParameterNames(fn) { var code = fn.toString() .replace(COMMENTS, '') .replace(FAT_ARROWS, '') .replace(DEFAULT_PARAMS, '');
var result = code.slice(code.indexOf('(') + 1, code.indexOf(')')) .match(/([^\s,]+)/g);
return result === null ? [] : result; }
module.exports = getParameterNames;
方法一考虑到单行注释,多行注释,默认值,箭头函数多种情况,适应情况更多,推荐使用方法一
toString其他用法