Подсчет вызовов функций с помощью JavaScript

Например: у меня много функций, и я использую их много раз. Мне нужно считать звонки для каждой функции. Какова лучшая практика, чтобы сделать это?

Сначала я думал, что мне нужны замыкания, но я не могу правильно их реализовать.

5 ответов

Решение

В простейшем случае вы можете украсить каждую функцию профилирующей оболочкой:

_calls = {}

profile = function(fn) {
    return function() {
        _calls[fn.name] = (_calls[fn.name] || 0) + 1;
        return fn.apply(this, arguments);
    }
}

function foo() {
    bar()
    bar()
}

function bar() {
}

foo = profile(foo)
bar = profile(bar)

foo()
foo()

document.write("<pre>" + JSON.stringify(_calls,0,3));

Для серьезной отладки вам лучше использовать специальный профилировщик (обычно расположенный в консоли вашего браузера).

Вы можете попробовать что-то вроде этого:

<script>
    var aCalls = 0;
    var bCalls = 0;
    function a()
    {
        aCalls = aCalls + 1;
        alert(aCalls);
    }
    function b()
    {
        bCalls = bCalls + 1;
        alert(bCalls);
    }
</script>
var count = 0;

function myfunction()
{
    count++;
    alert( "Function called " + count);
}


myfunction();
myfunction();

http://jsfiddle.net/xsdzpmwm/3/

Лучший способ - использовать профилировщик.

В IE: нажмите F12, чтобы открыть инструменты разработчика, затем перейдите на вкладку Profiler и нажмите кнопку воспроизведения. После остановки профилировщика вы получите много информации (количество вызовов для каждой функции, включенное время, исключительное время и т. Д.)

В Chrome: нажмите F12, перейдите в "Профили", "Собрать профиль ЦП JavaScript", хотя количество вызовов не будет указываться.

Мой подход заключается в добавлении свойства count к самой функции.

Просто добавьте одну строку в начале функции, которую вы хотите отслеживать.

      function func() {
  func.count = (func.count || 0) + 1;
  // first time you call the function func.count is undefined so use 0 instead 
  console.log("hi");
}

func();
console.log(func.count) // 1
func();
func();
func();
console.log(func.count) // 4

В конце концов, функции — это объекты в javascript. Нет загрязнения глобального пространства имен, не требуется обёртывания или закрытия, очень просто понять и написать.

Другие вопросы по тегам