# JavaScript 支持情況
# 運行限制
基于安全考慮,小程序中不支持動態(tài)執(zhí)行 JS 代碼,即:
- 不支持使用
eval執(zhí)行 JS 代碼 - 不支持使用
new Function創(chuàng)建函數new Function('return this')除外
# 標準 ECMAScript 支持
小程序的 JS 執(zhí)行環(huán)境 在不同平臺上的執(zhí)行環(huán)境存在差異,因此導致不同平臺對 ECMAScript 標準的支持存在差異。
小程序基礎庫為了盡量抹平這些差異,內置了一份 core-js Polyfill。core-js 可以將平臺環(huán)境缺失的標準 API 補齊。
需要注意的是,平臺對 ECMAScript 語法的支持差異無法抹平,當你需要使用一些高級語法時,如 async/await 時,則需要借助 代碼轉換工具 來支持這些語法。
# 無法被 Polyfill 的 API
以下 API 在部分低版本客戶端中無法使用,請注意盡量避免使用
Proxy對象
# 與標準的差異
# Promise 時序差異
由于 iOS JavaScriptCore 的限制,iOS 15 及以下的 Promise 是一個使用 setTimeout 模擬的 Polyfill。這意味著 Promise 觸發(fā)的任務為普通任務,而非微任務,進而導致 在 iOS15 及以下的 Promise 時序會和標準存在差異。
iOS 16 及以上不存在差異。
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(() => {
// 應該輸出 [1,2,3,4,5,6,7]
// 在 iOS15 小程序環(huán)境,這里會輸出 [1,2,3,4,6,5,7]
console.log(arr)
}, 1000)
關于普通任務和微任務的區(qū)別可以查看這篇文章
# 如何判斷當前環(huán)境需要哪些 Polyfill & 代碼轉換目標
特定的小程序基礎庫版本有最低微信客戶端版本要求,如基礎庫 v2.15.0 要求安卓最低版本 7.0.22,iOS 最低版本 7.0.20。
而特定的客戶端版本有最低操作系統版本要求,如 iOS 7.0.20 要求最低 iOS 10。
從而,當指定特定小程序基礎庫版本時(可以在 小程序管理頁 【設置】-【基本設置】-【基礎庫最低版本設置】中設置),我們能夠得到最低需要支持的執(zhí)行環(huán)境。
具體數據可以從 這個開源庫 中獲得。