cqwcns 发表于 2021-10-14 08:52

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>

zhzhch335 发表于 2021-10-14 09:09

直接加括号调用有啥问题吗{:1_904:}
平时写小程序 vue项目 或者ts的时候不都有这种情况吗?

xss5813 发表于 2021-10-14 09:12

2楼的方法可以

kof21411 发表于 2021-10-14 09:33

data()

LTTing 发表于 2021-10-14 09:36

console.log(data.action())
为什么要把action赋给paramB没理解

cqwcns 发表于 2021-10-14 10:16

kof21411 发表于 2021-10-14 09:33
data()

个人认为,此正解。

谢谢各位

cqwcns 发表于 2021-10-14 10:17

LTTing 发表于 2021-10-14 09:36
console.log(data.action())
为什么要把action赋给paramB没理解

传过来的参

icysky0605 发表于 2021-10-14 10:21

本帖最后由 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]
查看完整版本: JS 根据字符串条件,访问函数的问题讨论