2012-07-06 82 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; 

它調用的定義二傳手,這將導致無限遞歸。