2013-09-24 27 views
2

這是我在學習Javascript和同時製作應用程序的過程中遇到的。Javascript遞歸父 - >子 - >父 - >子引用,我需要使用替代嗎?

var A = function (parent) { 
    this.parent = parent; 
}, 
    b = new Object(); 

b.a = new A(b); 

這段非常簡單的代碼產生了一些相當有趣的東西。

console.log(b.a.parent.a.parent.a); 

http://i.imgur.com/g6fw6mZ.png 這是否會引起其他問題?因爲我正計劃在我的應用程序中使用類似的東西。

我會使用它的原因是因爲我需要引用屬於父級的變量。

這幾乎與here相同。但是,我不能在這裏使用閉包,因爲我甚至沒有最外層的功能!

的我的代碼精簡版本如下:

var Scratchpad = function (canvas) { 
    var ctx = canvas.getContext('2d'); 
    ctx.childMustAccessThis = 3; 

    ctx.Brush = new Brush(ctx); 
    return ctx; 
}, 
    Brush = function (parent) { 
     this.parent = parent; 

     // Other vars 
    }; 

Brush.prototype.getContext = function() { 
    return this.parent.childMustAccesThis; 
} 

我需要與他們各自的刷來使這些暫存器的多個(修改上下文對象)。

我不知道該怎麼做,這似乎是無害的,但我覺得這是不好的做法。

我試過一些其他的東西,比如在鏈接的SO帖子中描述的封閉。但是,當然,這是行不通的,因爲我的Scratchpad函數不會自行返回,而是返回一個修改的ctx對象,所以任何閉包變量都會被垃圾回收(對嗎?至少它們已經消失了)。

我的其餘嘗試依賴於JavaScript對象行爲的錯誤理解,所以這些都不值得一提。

那麼,我該怎麼做呢?保持現在的狀態?或者你有什麼建議可以更好地處理這個問題?

回答

2

這就是所謂的循環引用。

現代垃圾收集器(而不是Netscape 2.0)將完美地處理它。

請注意,舊版本的IE無法處理DOM對象和純JS對象之間的循環引用。

0

使用循環引用將不會有問題只要您不需要將它們轉換爲JSON即可!

明顯的遞歸對象結構不能很容易地表示爲一個字符串,你會看到類似這樣的錯誤;

TypeError: Converting circular structure to JSON 
0

現代瀏覽器中的循環引用沒有任何問題。

但是,您需要了解它們,或者至少有一個機制可以在實現遞歸算法時檢測它們。另外,默認JSON.stringify會抱怨循環引用,但很容易就是dealt with