2014-10-28 5 views
1

Есть ли способ получить все имена пользовательских функций, которые будут/могут быть вызваны в массив? Пример:список настраиваемых функций, которые могут быть вызваны

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

Если вернуться foo в массиве, не boo Здесь функция Foo не может быть вызван, но я все равно хочу иметь список (массив?) Все пользовательские функции, которые в коде (не обязательно называемый). Просто уточнить: я хочу знать, может ли функция называть, если она существует, и не нужно знать, будет ли она выполнена либо , либо. Как я могу сделать это эффективно?

Редактировать: Я хочу, чтобы это как замена явного объявления, которое я использовал ранее:

using blah;
и единственное, что должны делать новые неявные декларации, найти имена функций, сравнить их со списком функций (массива) и написать совпадения в другой массив

+1

Это может быть вызвано из общего кода или только из обработчиков событий? – Scimonster

+0

@Scimonster общий код, включая внешние файлы – user3088260

+0

Это будет очень сложно. – Scimonster

ответ

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' is undefined

ReferenceError: doIt is not defined

Однако ... есть лучший способ. Если вы хотите загрузить модуль (что похоже на то, о чем вы ссылаетесь на свои комментарии), вы можете использовать RequireJS для загрузки частей своей программы по запросу в браузере. Это очень зрелый способ сделать это.

+0

Пример работы и сбоев этого метода ... http://jsfiddle.net/kg22ndck/ – Fenton

+0

Щелчок был всего лишь примером. Мне нужны все функции – user3088260

+0

Вам нужен инструмент для этого - некоторые IDE, такие как Visual Studio и WebStorm, могут «найти все ссылки» на функцию (хотя это делается с использованием статического анализа и не может быть на 100% точным, если у вас есть фанковый код). Вы можете стать экспертом в компиляторе TypeScript - когда он компилирует код, он создает дерево кода, что может дать вам половину ответа (он будет рассказывать только, какие ссылки есть в коде, и не будет включать вызовы с HTML-страниц или встроенный JavaScript). По сути, то, что вы запрашиваете, - это очень большой вопрос - вам нужно будет написать что-то размером с веб-браузером, чтобы это сделать. – Fenton

1

Проще говоря, это невозможно узнать, пока оно на самом деле не называется. Существует так много разных способов вызова функции. Например, это будет все вызов foo():

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

Единственное, что могло бы, возможно, работа, чтобы получить все функции от window объекта, а затем выполнить поиск регулярных выражений для их вызова. Очевидное предостережение состоит в том, что он не поймает большинство моих примеров выше.

+0

как об основных вызовах 'foo()'? – user3088260

+0

Те, кого вы могли бы найти с регулярным выражением, как я уже сказал. – Scimonster

+0

Не повлияет ли это на производительность? – user3088260