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

JSON.stringify 無(wú)法轉(zhuǎn)換這種結(jié)構(gòu),所以報(bào)錯(cuò)。
如果非要這樣寫,可以改成:

|