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);