Skip to content

JS支援情況

運轉限制

基於安全考慮,小遊戲中不支援動態執行 JS 程式碼,即:

  • 不支援使用 eval 執行 JS 程式碼。
  • 不支援使用 new Function 建立函數。

標準 ECMAScript 支援

小遊戲的 JS 執行環境 在不同平台上的執行環境存在差異,因此導致不同平台對 ECMAScript 標準的支援有差異。

小遊戲基礎庫為了盡量抹平這些差異,內建了一份 core-js Polyfill。 core-js 可以將平台環境缺少的標準 API 補齊。

要注意的是,平台對 ECMAScript 語法的支援差異無法抹平,當你需要使用一些高階語法時,例如 async/await 時,則需要藉助開啟 ES6 轉 ES5 的功能來支援這些語法。

無法被 Polyfill 的 API

以下 API 在部分低版本用戶端中無法使用,請注意盡量避免使用:Proxy 對象。

與標準的差異

Promise 時序差異

由於 iOS JavaScriptCore 的限制,iOS 15 及以下的 Promise 是使用 setTimeout 模擬的 Polyfill。這表示 Promise 觸發的任務為普通任務,而非微任務,進而導致在 iOS15 及以下的 Promise 時序會和標準有差異。

iOS 16 以上不存在差異。

js
var arr = [];

setTimeout(() => arr.push(6), 0);
arr.push(1);
const p = new Promise((resolve) => {
  arr.push(2);
  resolve();
});
arr.push(3);
p.then(() => arr.push(5));
arr.push(4);
setTimeout(() => arr.push(7), 0);

setTimeout(() => {
  // Expected output: [1, 2, 3, 4, 5, 6, 7]
  // On iOS 15 mini game environment, the output will be: [1, 2, 3, 4, 6, 5, 7]
  console.log(arr);
}, 1000);

關於普通任務和微任務的差異可以查看深入:微任務與 JavaScript 執行環境。