Kamil
Kamil

Reputation: 61

Function count calls

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?

Upvotes: 6

Views: 12811

Answers (5)

aljgom
aljgom

Reputation: 9149

ob = function f(){  
  ++f.count || (f.count = 1);   // initialize or increment a counter in the function object
  return f.count; 
}

Upvotes: 3

terrymorse
terrymorse

Reputation: 7096

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

Upvotes: 1

paulodiovani
paulodiovani

Reputation: 1305

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

Upvotes: 2

pldg
pldg

Reputation: 2588

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/

Upvotes: 1

Marcelo Cantos
Marcelo Cantos

Reputation: 185962

var increment = function() {
    var i = 0;
    return function() { return i += 1; };
};

var ob = increment();

Upvotes: 8

Related Questions