我正在寻找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 = []
,但有没有办法在函数之间封装函数中的值?
答案 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.
};
})();
这样,myvar
在FNS.itemCache
的范围内定义。由于匿名函数包装器,无法从其他地方修改变量。