Function count calls
11,216
Solution 1
var increment = function() {
var i = 0;
return function() { return i += 1; };
};
var ob = increment();
Solution 2
ob = function f(){
++f.count || (f.count = 1); // initialize or increment a counter in the function object
return f.count;
}
Solution 3
A one liner option:
const counter = ((count = 0) => () => count++)()
Usage example:
> counter()
0
> counter()
1
> counter()
2
> counter()
3
> counter()
4
> counter()
5
> counter()
6
Solution 4
Wrap a counter to any function:
/**
* Wrap a counter to a function
* Count how many times a function is called
* @param {Function} fn Function to count
* @param {Number} count Counter, default to 1
*/
function addCounterToFn(fn, count = 1) {
return function () {
fn.apply(null, arguments);
return count++;
}
}
See https://jsfiddle.net/n50eszwm/
Solution 5
There are also the new Generator functions, which offer a simple way to write a counter:
function* makeRangeIterator(start = 0, end = 100, step = 1) {
let iterationCount = 0;
for (let i = start; i < end; i += step) {
iterationCount++;
yield i;
}
return iterationCount;
}
const counter = makeRangeIterator();
const nextVal = () => counter.next().value;
console.log("nextVal: ", nextVal()); // 0
console.log("nextVal: ", nextVal()); // 1
console.log("nextVal: ", nextVal()); // 2
console.log("nextVal: ", nextVal()); // 3
Author by
Admin
Updated on June 04, 2022Comments
-
Admin almost 2 years
I'm a beginner with JavaScript so please be patient =)
I am trying to write a function that counts the number of times it is called. What I have so far is a function with a counter that is incremented explicitly:
var increment = function () { var i = 0; this.inc = function () {i += 1;}; this.get = function () {return i;}; }; var ob = new increment(); ob.inc(); ob.inc(); alert(ob.get());
But I'm wondering how to call only
ob();
, so the function could increment calls made to itself automatically. Is this possible and if so, how? -
Shef over 12 years+1. @naveen: The noob seems to be heading that way on his/her own. :)
-
naveen over 12 years@Shef: I said its good. Its a while before I realized there were closures. But then js was my secondary language. a tiny perk that has alertboxes :)
-
Shef over 12 years@naveen: I just agreed with you. :) I, too, was surprised to see the OP, a self-declared beginner, trying to learn closures.
-
Alex S over 12 yearsThe OP's code is almost identical to one of my first attempts to learn JS. Being a noob JS programmer doesn't imply being a noob programmer.
-
Admin over 12 years@Marcelo Cantos: dont understand your's laugh cuz that what u wrote isn't increment ... ? Nice work Mr A lot of experience in OP
-
Alex S over 12 years@Kamil: Try invoking
alert(ob())
a couple of times. -
Vaibhav Pachauri about 9 years@MarceloCantos : I am noon myself :) . I just want to know the reason why do we have to use var ob = increment(); and then call ob(); to increase the 'counter' value. Why does it not increment the counter value if we directly call the increment() function ?
-
Alex S about 9 years@Vaibhav: The increment function itself doesn't increment anything. It returns a function that does.
ob
holds that function. -
Denis about 2 yearsHi, how do you re-set this counter to 0?
-
terrymorse about 2 years@Denis There is no reset feature, but you can call makeRangeIterator() again to create a new counter.