JS 利用 eval 动态获取 函数内部参数名(伪反射)

2017-07-06  本文已影响0人  hyperRect

通过获得函数代码 => 字符串 + 正则解析 的方式 , 配合eval

function getParamName() {}

function fn() {
  var param1 = 0
  var a = 2

  console.log(getParamName(param1))
  console.log(getParamName(a))
}

function callWithVariableName(fn) {
  eval('(' + fn.toString().replace(/\bgetParamName\s*\(([a-zA-Z_$][\w_$]*)\)/g, function(u, v) {
    return "'" + v + "'"
  }) + '())')
}

callWithVariableName(fn)

解释一下:
callWithVaraiableName 的意思是先去读取包含A函数中包含 ----getParamName+"(" + 参数名 + ")"---- 这样的字符串, 然后调用replace函数中多次匹配。
每次匹配后, 通过回调函数中原型链中的第二个参数(也就是v) 获得字符串的参数名,return出去。
再通过(function())的方式让函数自己执行一遍, 最后把整段代码塞回console.log中, 通过console.log打印出来

经过正则匹配替换后的函数会变成这样的statement

function fn() {
↵  var param1 = 0
↵  var a = 2
↵
↵  console.log('param1')
↵  console.log('a')

这样通过eval(statement()) 执行一遍就可以打印出来了, 但这种实现方式的前提是你得先去写 console.log(getParamName(param1))
console.log(getParamName(a)) 这些在函数中

上一篇 下一篇

猜你喜欢

热点阅读