如何在调用之间维护JavaScript函数变量状态(值)?

时间:2011-10-02 08:49:59

标签: javascript jquery

我正在寻找getter和setter功能,但还不能依赖__defineGetter____defineSetter__。那么如何在函数调用之间维护函数变量的值?

我尝试了显而易见的事,但myvar在函数的开头总是未定义的:

FNS.itemCache = function(val) {
    var myvar;
    if( !$.isArray(myvar)
        myvar = [];
    if( val === undefined)
        return myvar;
    .. // Other stuff that copies the array elements from one to another without
       // recreating the array itself.
};

我总是可以在函数上方放置另一个FNS._itemCache = [],但有没有办法在函数之间封装函数中的值?

3 个答案:

答案 0 :(得分:4)

您可以使用arguments.callee作为对当前函数的引用,将值存储在函数中:

FNS.itemCache = function(val) {
    if( !$.isArray(arguments.callee._val)
        arguments.callee._val = [];
    if(val === undefined)
        return arguments.callee._val;
    .. // Other stuff that copies the array elements from one to another without
       // recreating the array itself.
};

但是,如果函数存储在原型中并因此被多个对象使用,则会中断。在这种情况下,您必须使用成员变量(例如this._val)。

答案 1 :(得分:4)

这是用于创建静态变量和创建对象的私有成员的标准模式

FNS.itemCache = (function() {
  var myvar;
  if( !$.isArray(myvar)
      myvar = [];
  return function(val) {
      if( val === undefined)
          return myvar;
         .. // Other stuff that copies the array elements from one to another without
         // recreating the array itself.
  }
})();

答案 2 :(得分:4)

设置私有变量的另一种方法是将函数定义包装在匿名函数中:

(function(){
    var myvar;
    FNS.itemCache = function(val) {
        if( !$.isArray(myvar))
            myvar = [];
        if( typeof val == "undefined")
            return myvar;
        .. // Other stuff that copies the array elements from one to another without
           // recreating the array itself.
    };
})();

这样,myvarFNS.itemCache的范围内定义。由于匿名函数包装器,无法从其他地方修改变量。