今天開發微信小程序調用setData 時遇到一個JSON.stringify 轉換一個循環引用結構的報錯。
setData工作原理
小程序的視圖層目前使用 WebView 作為渲染載體,而邏輯層是由獨立的 JavascriptCore 作為運行環境。在架構上,WebView 和 JavascriptCore 都是獨立的模塊,并不具備數據直接共享的通道。當前,視圖層和邏輯層的數據傳輸,實際上通過兩邊提供的 evaluateJavascript 所實現。即用戶傳輸的數據,需要將其轉換為字符串形式傳遞,同時把轉換后的數據內容拼接成一份 JS 腳本,再通過執行 JS 腳本的形式傳遞到兩邊獨立環境。
而 evaluateJavascript 的執行會受很多方面的影響,數據到達視圖層并不是實時的。同一進程內的 WebView 實際上會共享一個 JS VM,如果 WebView 內 JS 線程正在執行渲染或其他邏輯,會影響 evaluateJavascript 腳本的實際執行時間,另外多個 WebView 也會搶占 JS VM 的執行權限;另外還有 JS 本身的編譯執行耗時,都是影響數據傳輸速度的因素。
其實就是setData(object) 時會調用JSON.stringify 。
循環應用例子:

JSON.stringify 無法轉換這種結構,所以報錯。
如果非要這樣寫,可以改成:

|