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

时间:2014-10-28 21:19:41

标签: javascript html function call

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

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

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

编辑:我希望这可以替代我之前使用的显式声明:

using blah;
并且新隐式声明应该做的唯一事情是,查找函数名称,将它们与列表中的函数(数组)和写入匹配到另一个数组

2 个答案:

答案 0 :(得分:1)

简单地说,直到它被实际调用才能知道。可以通过许多不同的方式调用函数。例如,这些都会调用foo()

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

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

答案 1 :(得分:0)

如果您想从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在浏览器中按需加载程序的一部分。这是一种非常成熟的方法。