less than 1 minute read

/**
 * 获取某方法传入参数的名称列表
 * @param {Function} func 
 * @returns {Array}
 */
function getFuncArguNames(func) {
  const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
  const ARGUMENT_NAMES = /([^\s,]+)/g;
  const fnStr = func.toString().replace(STRIP_COMMENTS, '');
  const result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
  if (result === null) return [];
  return result;
}

目前,js 中是没有原生获取函数形参名的方法的,但是将函数 toString 后,可以获取到函数的定义代码字符串。通过筛选定义字符串,可以过滤出形参列表。上面的方法就是这么做的。当然这种方法有一定的限制,但对于一般函数、包括箭头函数,都是 OK 的。

注意点

  • 若在生产环境上有使用代码优化、进行变量名混淆。可能不适宜使用该方法动态获取形参名。
  • 参见里还有升级版的方法,用于处理 es6 的形参存在默认值定义时的一些问题。

补充:获取函数参数名通常是为了依据参数名动态注入参数,但在混淆的情况无法达成。angularjs 中为此提供的方案是传入数组,数组的最后一项为函数,之前项为字符串,指明要注入到最后项函数中的数据。

参见

How to get function parameter names/values dynamically?