Javascript - 使用闭包增加静态函数变量模拟?

时间:2013-10-05 02:30:27

标签: javascript scope closures

所以似乎Javascript中没有函数静态变量。我试图在函数内增加一个变量,但我不想这样做:

function countMyself() {
    if ( typeof countMyself.counter == 'undefined' ) {
        // It has not... perform the initilization
        countMyself.counter = 0;
    }
}

我想用闭包来做,但我很难理解这些。

有人在另一个问题中暗示了这一点:

var uniqueID = (function() {
   var id = 0;
   return function() { return id++; };
})();

但是当我提醒uniqueID时它所做的就是打印这一行:return function(){return id ++; };

所以我想知道如何在不污染全局范围的情况下增加函数中的变量。

3 个答案:

答案 0 :(得分:5)

你必须调用 uniqueID - 你不能只是引用就好像它是一个变量:

> uniqueID
function () { return id++; }

> uniqueID()
0

> uniqueID()
1

答案 1 :(得分:1)

显式地分配给uniqueID而不是从立即调用的lambda返回它可能会使事情变得更清楚:

var uniqueId; //declare uniqueId in the outer scope

function initializeUniqueId(){
    var id=0;
    uniqueId = function(){
        return id++;
    }
}

initializeUniqueId();

console.log( uniqueId ); //what you are currently doing
console.log( uniqueId() }; //what you should be doing.

与我刚写的(function(){}())相比,版本的优点是初始化函数是匿名的,你只需要编写一次“uniqueId”。

答案 2 :(得分:0)

只需查看此代码即可 我想增加' _a'变量

ES6

中的

let a = () => {
  let _a = 1;
  return () => _a++;
}

let clo = a();
for (var i = 0; i < 5; i++) {
  console.log(clo());
}

ES5

var a = function() {
  var _a = 1;
  return function() {
    return _a++;
  }
}

var clo = a();
for (var i = 0; i < 5; i++) {
  console.log(clo());
}