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

通过获得函数代码 => 字符串 + 正则解析 的方式 , 配合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)) 这些在函数中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 有人说过,很多弯路到最后都成了直路,所有的坑到最后也都成了坦途;所谓的直路和坦途并不是摆在眼前的,都是不断的的...
    老衲法号一眉道人阅读 1,377评论 0 4
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 4,071评论 0 20
  • 快速的口录账号密码,声轨、瞳孔全部核对完毕,酒醒半分不足的鳄鱼眼前的世界逐渐回归自己熟知的地方,艾城黑潮内政厅大堂...
    Mod模君阅读 271评论 0 1
  • 我一点一点的学习着长大, 我还没学好之前确已经长大了。 一点点的时光, 一点点的空间, 被我用一点点船无聊占满, ...
    女瓦阅读 78评论 0 1