For example: I have a lot of functions and use them many times. I need to count calls for each function. What is the best practice to make it?
At first i thought i need closures, but I can't implement it in a right way.
For example: I have a lot of functions and use them many times. I need to count calls for each function. What is the best practice to make it?
At first i thought i need closures, but I can't implement it in a right way.
In the simplest case, you can decorate each function with a profiling wrapper:
_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));
For serious debugging, you might be better off with a dedicated profiler (usually located in your browser's console).
You could try something like this:
<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();
The best way is to use a profiler.
On IE: press F12 to open developer tools, then go to the Profiler tab, and hit the play button. After stopping the profiler, you'll be presented with a lot of info (number of calls for each function, inclusive time, exclusive time, etc.)
On Chrome: press F12, go to Profiles, Collect JavaScript CPU Profile (that won't tell you the number of calls though)
My approach would add a property “count” to the function itself.
Just add one line at the beginning of your function you want to have tracked calls.
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
Functions are objects in javascript after all. No pollution of global namespace, no wrapping or closures needed, very simple to understand and to write.