将字符串转换为JavaScript函数

3

假设我正在使用一些HTML5数据属性,并且想知道在某个div标签完成某项任务时应调用哪个函数。

因此,我的数据可能如下所示:

data-callback='jsAPI.aSubset.desiredFunction'

我该如何将回调函数(一个字符串)转换为我想要调用的函数。一个简单的全局函数,例如:
data-callback='_myfunction'

<script>
    function _myfunction() { alert("yes my function"); }
    $("div").click(function() {
        var fn = $(this).data("callback");
        if (typeof fn === 'function') {
            fn();
        }
    })
</script>

但是我该如何使用之前的 jsAPI.aSubset.desiredFunction 呢?谢谢。

5个回答

4
听起来这是使用可怕的eval()函数的一个很好的例子。
我会像这样做:
var fnString = "jsAPI.aSubset.desiredFunction";
var fn = eval(fnString);
if (typeof(fn) === "function") {
    fn.apply();

2

如果您没有 . 链,则只使用方括号可能有效。

请尝试使用以下方法:

var elms = fn.split(".");
var curr = window;
var nxt;
while(nxt = elms.shift()) curr = curr[nxt];
curr();

1
您可能只需要使用Function("functionstring")。Function函数将从字符串返回一个函数。

1

Use square brackets...

jsAPI.aSubset[fn]();

所以...

if (typeof jsAPI.aSubset[fn] === 'function') {
    jsAPI.aSubset[fn]();
}

我说这个项目是一个字符串...你只是在调用字符串中的函数,好像我可以神奇地知道该怎么称呼它。 - ThePrimeagen
我应该澄清一下,在data-callback属性中,你所需要/想要的只是实际的函数名desiredFunction。如果你事先不知道对象嵌套,那么你会想要像@Kolink的答案中的内容一样。 - user1106925
@Michael:为什么提前知道将使用哪个子集会是魔法呢? - user1106925
@Michael:问题中提供的解决方案根本行不通,因为“fn”将是一个字符串。 - user1106925
@AdamRackis:谢谢兄弟。得承认我更关注底部看起来更像对象引用而不是字符串的文本。不太确定为什么一开始会采取这种方法,但肯定有一些好的理由吧。 - user1106925
显示剩余2条评论

0

如果函数在全局作用域中定义,请尝试使用window[fn]()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接