有没有办法获得将要/可能被调用到数组的所有自定义函数名称?例如:
<button onclick="foo()">lol</button>
<script>function foo(){
alert("clicked");
}
function boo(){
alert("clicked");
}
</script>
应该在数组中返回foo
,而不是boo
这里可能没有调用函数foo但是我仍然想要一个代码中所有自定义函数的列表(数组?)(不一定被调用)。只是为了澄清:我想知道函数可能是否存在,如果它存在并且不需要知道 是否也将被执行。我怎样才能有效地做到这一点?
编辑:我希望这可以替代我之前使用的显式声明:
using blah;并且新隐式声明应该做的唯一事情是,查找函数名称,将它们与列表中的函数(数组)和写入匹配到另一个数组
答案 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在浏览器中按需加载程序的一部分。这是一种非常成熟的方法。