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)) 这些在函数中