JS 根据字符串条件,访问函数的问题讨论
本帖最后由 cqwcns 于 2021-10-14 08:54 编辑根据字符串条件,访问函数,我现在想得到的是eval,不知道是不是标准的方法,欢迎大家指正。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试</title>
<script>
const data = {
name: '周星驰',
action: () => '李小龙'
}
// 这里省略若干代码,收到一些传参,字符串类型。
const paramA = 'name', paramB = 'action'
// 根据传参访问data。
console.log(data)
// 打印了字符串“周星驰”
console.log(data)
// 打印了函数() => '李小龙'
// 问题在于,如何通过paramB直接调用action函数,获得返回结果
// 我想到的是这样:
console.log(eval(`data.${paramB}()`))
// 打印了字符串'李小龙'
</script>
</head>
<body>
</body>
</html> 直接加括号调用有啥问题吗{:1_904:}
平时写小程序 vue项目 或者ts的时候不都有这种情况吗? 2楼的方法可以 data() console.log(data.action())
为什么要把action赋给paramB没理解 kof21411 发表于 2021-10-14 09:33
data()
个人认为,此正解。
谢谢各位 LTTing 发表于 2021-10-14 09:36
console.log(data.action())
为什么要把action赋给paramB没理解
传过来的参 本帖最后由 icysky0605 于 2021-10-14 10:37 编辑
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试</title>
<script>
const data = {
name: '周星驰',
action: (myname,age) => myname + age
}
Function.prototype.getName = function(){
return this.name || this.toString().match(/function\s*([^(]*)\(/)
}
const paramA = 'name', paramB = 'action'
if(typeof data === 'function'){
document.write("函数名称:"+data.getName()+"<br/>")
document.write("参数数量:"+data.length+"<br/>")
document.write("参数列表:"+getParameterName(data).join(",")+"<br/>")
document.write("执行结果:"+data("张三",18)+"<br/>")
}
function getParameterName(fn) {
if(typeof fn !== 'object' && typeof fn !== 'function' ) return;
const COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
const DEFAULT_PARAMS = /=[^,)]+/mg;
const FAT_ARROWS = /=>.*$/mg;
let code = fn.prototype ? fn.prototype.constructor.toString() : fn.toString();
code = code
.replace(COMMENTS, '')
.replace(FAT_ARROWS, '')
.replace(DEFAULT_PARAMS, '');
let result = code.slice(code.indexOf('(') + 1, code.indexOf(')')).match(/([^\s,]+)/g);
return result === null ? [] :result;
}
</script>
</head>
<body>
</body>
</html>
页:
[1]