2012-07-06 101 views
0

我收到以下错误在JavaScript中定义的二传手“的RangeError:超过最大调用堆栈大小”。定义getter和setter方法在JavaScript

的码4如下:

二传手DEFN:

this.__defineSetter('_myList', function(list) 
     { 
       log.debug("in setter ...."); 
      if(this._myList == list) 
      { 
       log.debug("in setter..");  
       return;   

      } 
      this._myList = list; 
     }); 

电话:

myMethod = function(msg)  
{ 
    try 
    {  
    this.myList = msg.myList; 
    }catch(e) 
    { 
     log.debug("error in calling setter... " + e); 
    } 
} 

我无法弄清楚为什么它会无限循环?

+0

不调用setter函数相同功能的最后一条语句再次? – 2012-07-06 07:04:41

+1

是啊,你只好去其他地方存储值,其中,这是()'已弃用错误的思路和使用__defineSetter的':https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineSetter我如果我是你,会避免使用这些API – ckozl 2012-07-06 07:07:44

回答

1

的问题是,你从模子中调用的setter ...

this._myList = list; 

应建立另一个“私人”变量来存储价值。事情是这样的......

var _myInnerList; 

this.__defineSetter__('_myList', function(list) { 
    log.debug("in setter ...."); 
    if(_myInnerList === list) { 
    log.debug("in setter..");  
    return;   
    } 
    _myInnerList = list; 
}); 

而且使用比较(总是)===和改变__defineSetter成...

__defineSetter__ 
2

当你调用

this._myList = list; 

它调用的定义二传手,这将导致无限递归。