Похоже, что вы действительно ищете функцию со статическим счетчиком. Для этого вы можете просто использовать немедленно выполняемую функцию.
var say = (function() {
var num = 0;
return function (val) {
// Not sure why you're passing val here, it's not used
num++;
console.log(num);
}
})();
Если вам не нужны несколько счетчиков, вам следует использовать более подходящие имена, чтобы всем было понятно, кто их читает.
function createCounter() {
var num = 0;
return function () {
console.log(++num);
}
}
Во втором примере вы реализовали то же самое с помощью счетчика на закрытии конструктора, назовем его Speaker.
function Speaker() {
var num = 0;
this.sayAlert = function() {
console.log(++num);
}
}
Они все делают одно и то же
say(); say(); //outputs 1,2
var speaker = new Speaker();
speaker.sayAlert(); speaker.sayAlert(); //outputs 1,2
var speaker2 = new Speaker();
speaker2.sayAlert(); speaker2.sayAlert(); //outputs 1,2
var ctr1 = createCounter(); ctr1(); ctr1(); //outputs 1,2
var ctr2 = createCounter(); ctr2(); ctr2(); //outputs 1,2
Какой из них использовать, зависит от того, хотите ли вы функцию или объект. И в основном, предпочитаете ли вы писать функциональный или ОО-код.