可能调用的自定义函数列表

list of custom functions that might be called

本文关键字:自定义函数 列表 调用      更新时间:2023-09-26

有没有办法获得所有将/可能被调用到数组的自定义函数名?示例:

<button onclick="foo()">lol</button>
<script>function foo(){
    alert("clicked");
}
function boo(){
    alert("clicked");
}
</script>

应返回数组中的foo,而不是boo在这里,函数foo可能不会被调用,但我仍然希望有一个代码中所有自定义函数的列表(数组?)(不一定被调用)。只是澄清一下:我想知道函数是否会被调用,如果它存在的话,我也不需要知道它是否会被执行。我如何才能有效地做到这一点?

编辑:我想用它来代替我以前使用的显式声明:

使用blah
,而新的隐式声明唯一应该做的就是找到函数名,将它们与函数列表(数组)进行比较,并将匹配项写入另一个数组

简单地说,在实际调用之前是不可能知道的。函数的调用方式有很多种。例如,这些都将调用foo():

foo();
window.foo();
this.foo();
window['foo']();
eval('foo()');
eval('foo')();
window['f'+'o'+'o']();
// and so on

唯一可行的方法是从window对象中获取所有函数,然后进行正则表达式搜索以调用它们。显而易见的警告是,它不会抓住我上面的大多数例子。

如果您想从onclick属性获得任何调用(而不仅仅是查找JavaScript中定义的函数),可以使用:

var elems = document.querySelectorAll('*');
var clickAttributeCode = [];
for (var i = 0; i < elems.length; i++) {
    if (elems[i].onclick) {
        clickAttributeCode.push(elems[i].getAttribute('onclick'));
        console.log(elems[i].getAttribute('onclick'));
    }
}

这不会得到动态附加的事件,只有实际放置在 onclick=""-html属性中的事件。这一点很重要,因为这不是绑定事件的推荐方式。举例来说,以下内容将找不到:

function go() {
    
}
document.getElementById('blah').onclick = go;

已添加注释

假设你想做一个";"按需加载";,您几乎可以通过检测丢失的函数然后加载它来做到这一点,例如使用window.onerror并解析错误以查找丢失的函数名。问题是消息因浏览器而异,所以这将是一个非常脆弱的系统。以下是在未定义函数时调用doIt()可以得到的两条错误消息。

"doIt"是未定义的

ReferenceError:doIt未定义

然而。。。有更好的方法。如果你想要模块加载(这似乎是你在评论中暗示的),你可以使用RequireJS在浏览器中按需加载部分程序。这是一种非常成熟的方法。