首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Flex 調用 JavaScript 傳參報錯 #1032 堆棧溢位?參數類型不匹配是元兇

     編輯:程式設計綜合問答

現象複現

Flex (ActionScript) 通過 ExternalInterface.call 調用頁面 JS 函數 report(lon, lat) 傳遞經緯度,結果拋出 Error #1032: Stack Overflow。若去掉參數僅調用 report() 則正常。

根因分析

ActionScript 與 JavaScript 類型映射失敗。lon、lat 在 AS 端可能是 Number、int 或自定義類,序列化為 JSON 時產生循環引用或超大對象,導致 JS 引擎遞歸解析爆棧。

解決方案:顯式轉字符串

if (ExternalInterface.available) {
    try {
        // 強制轉為字符串,繞過複雜對象序列化
        ExternalInterface.call("report", String(lon), String(lat));
        // 或模板字面量:`${lon}`, `${lat}`
    } catch (e:Error) {
        trace("JS 呼叫失敗: " + e.message);
    }
}

JS 端接收建議

function report(lonStr, latStr) {
    // 再次轉數值,業務邏輯用 Number
    const lon = parseFloat(lonStr);
    const lat = parseFloat(latStr);
    if (isNaN(lon) || isNaN(lat)) return;
    console.log(`收到坐標: ${lon}, ${lat}`);
    // 後續地圖標註等邏輯
}

深度避坑指南

  • 禁止傳遞複雜對象:Date、Array、自定義類、含循環引用的物件都會觸發 #1032。
  • 統一用字符串/基礎類型:Boolean、Number、String、null/undefined 安全;其餘一律 JSON.stringify 後傳字符串,JS 端 JSON.parse 還原。
  • 調試技巧:Chrome DevTools → Console 勾選 "Preserve log",觀察 ExternalInterface 實際發送的內容。

擴展:雙向通信最佳實踐

// AS 註冊回調供 JS 主動調用
ExternalInterface.addCallback("flexReady", onFlexReady);

function onFlexReady():void {
    ExternalInterface.call("onFlexLoaded"); // 通知頁面 Flex 就緒
}

參考 CSDN 討論:ExternalInterface 參數傳遞完整避坑

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved