2009-11-25 2 views
0

Я хотел бы рассчитать количество вызовов, сделанных в eval, в нашем приложении javascript.Подсчет звонков на eval

Я придумал следующее, но оно порождает ошибки. Эти ошибки трудно отслеживать, и мои знания в приложении ограничены.

Вы можете сообщить что-то не так с моим кодом?

increment = function(){ 
    var me = arguments.callee; 
    if (!me.count) me.count = 0; 
    return ++me.count; 
} 

var oldEval = eval; 

eval = function eval(string){  
    console.log('eval number ', increment()); 
    return oldEval(string); 
} 

Или вам известен альтернативный способ подсчета использования eval?

благодаря

Оливье

ответ

1

Я придумал рудиментарное решение. Кажется, что работает, по крайней мере, я могу собрать некоторые данные, но я не уверен на 100%, что это правильно.

, так что я просто делаю:

eval = eval; 

При том, что профайлер Firebug, умеет считать вызовы Eval, но не группа, подсчитывая, поэтому я должен копировать и вставлять, чтобы преуспеть, и построить pivot Table, чтобы получить данные.

+0

Скажите, что теперь? Пожалуйста, дополните! –

+0

Существует не так много, чтобы уточнить. eval = eval; после этого вызовы eval() сообщаются профилировщиком Firebug. Однако они рассчитаны на несколько строк, поэтому я использую excel, чтобы суммировать их все. В Firebug, выход взгляд профайлер так: Eval() \t \t 1 0,01% \t \t 0.024ms 0.979ms \t \t 0.979ms 0.979ms \t \t 0.979ms 326 (строка 1) Eval() \t \t 1 0,01 % \t \t 0.024ms 0.991ms \t \t 0.991ms 0.991ms \t \t 0.991ms 318 (линия 1) Eval() \t \t 1 0.01% \t 0.024ms \t 0.759ms \t \t 0.759ms 0.759ms \t \t 0.759ms 313 (линия 1) Этот метод может вероятно, используется для подсчета вызовов на любые другие нативных яваскрипта функций. – Olivvv

+0

@Olivvv, как я могу включить это в javascript, я имею в виду, что я не могу показать параметры eval с помощью этой функции – user1275375

0

Единственное, что выскакивает ваше имя аргумента «строка»

Попробуйте изменить его в «ул» или что-то. Некоторым браузерам может не нравиться «String», поскольку на самом деле это имя класса (особенно IE, которое часто игнорирует чувствительность к регистру)

Примечание. Я проверил ваш код и работает в Firefox 3.5 (с установленным дополнением Firebug)

Если у вас нет определенного объекта console или метода log на указанном объекте консоли, вы получите ошибки. (например, если Firebug или аналогичный не установлен)

5

К сожалению, не существует водонепроницаемого способа эмулирования/обертывания eval, поскольку он не является нормальной функцией. Он может получать доступ (как читать, так и записывать) локальные переменные прямого вызова.

function testeval() { 
    var a= 2; 
    eval('a*= 2'); 
    alert(a); // 4 
}; 

Это магия, которую вы не можете эмулировать из встроенной функции JavaScript. У вас не было бы пути от myWrappedEval, чтобы получить значение a в вызывающем абоненте или записать обратно измененное значение. Пока вы можете получить функцию звонящего, используя arguments.caller, нет возможности прочитать локали вызова функции.

Вам необходимо вручную вставить звонок в increment непосредственно перед каждым использованием eval, которое вы можете найти в источнике. Или, лучше, удалите каждый звонок до eval и замените его на лучший код, сделав звонок полным ноль. ;-)

+0

Забыл об этом. В зависимости от того, что 'eval' используется для этого украшения, вероятно, полностью его сломает. Черт, JS требует 'caller.locals()' так плохо. –

+0

Спасибо. Проблема не связана с природой, если я удалю ее, ее то же самое. Я не уверен, что вопрос arguments.caller является источником проблемы, поскольку он ломает методы, которые не используют это. – Olivvv

+0

'arguments.caller' не связан с проблемой, просто упоминается как стратегия обходного пути (это не сработает!). Проблема будет возникать для * любого вызова '' eval', который использует локальные переменные функции. – bobince

-1

Попробуйте эту модифицированную версию

var increment = function() { 
    var me = arguments.callee; 
    if (!me.count) me.count = 0; 
    return ++me.count; 
} 

var oldEval = eval; 

eval = function (str) { 
    alert('eval number ' + increment()); 
    return oldEval(str); 
} 
  • Переименован string к str
  • используется предупреждение вместо console.log (который не доступен во всех браузере)
  • Измененный вызов предупреждать use string concatenation
  • изменен новый объект eval будет анонимным (удалено имя eval)
+0

Спасибо, но это не поможет. пункты 1 и 4 ничего не меняют, и у меня есть сотни случаев, поэтому я не буду использовать alert(); – Olivvv

+0

Итак, снова замените 'alert' на console.log. Итак, теперь я полагаю, что console.log работает для вас. Вы рассмотрели вопрос о регистрации самого аргумента (str) и проверьте, какие из них он разбивает. Затем отправьте несколько образцов в свой вопрос – jitter