通過獲得函數(shù)代碼 => 字符串 + 正則解析 的方式 箕慧, 配合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函數(shù)中包含 ----getParamName+"(" + 參數(shù)名 + ")"---- 這樣的字符串剩失, 然后調(diào)用replace函數(shù)中多次匹配句狼。
每次匹配后蒂教, 通過回調(diào)函數(shù)中原型鏈中的第二個參數(shù)(也就是v) 獲得字符串的參數(shù)名清笨,return出去圆恤。
再通過(function())的方式讓函數(shù)自己執(zhí)行一遍音比, 最后把整段代碼塞回console.log中, 通過console.log打印出來
經(jīng)過正則匹配替換后的函數(shù)會變成這樣的statement
function fn() {
? var param1 = 0
? var a = 2
?
? console.log('param1')
? console.log('a')
這樣通過eval(statement()) 執(zhí)行一遍就可以打印出來了隧哮, 但這種實現(xiàn)方式的前提是你得先去寫 console.log(getParamName(param1))
console.log(getParamName(a)) 這些在函數(shù)中