支付寶小程序框架 事件·小程序的JavaScript引擎

2020-09-18 10:30 更新

運行引擎

小程序的 JavaScript 代碼分為邏輯層腳本和 sjs 腳本,它們運行在相同的 JavaScript 引擎的不同線程中。

在不同操作系統(tǒng)上,小程序的 JavaScript 引擎是不同的。在 iOS 平臺上,腳本運行在操作系統(tǒng)提供的 JavaScriptCore 引擎上;而在 Android 平臺上,腳本則運行在支付寶提供的 V8 引擎上。

支付寶小程序通過對開發(fā)者上傳的代碼進行 babel 轉(zhuǎn)換,使 JavaScript 引擎支持絕大多數(shù) ES6 的新特性。但是對于 ES6 擴展的內(nèi)置對象,小程序并未在 JavaScript 引擎上提供 polyfill,因此會導(dǎo)致在不同平臺的 JavaScript 引擎中,對不同的 ES6 擴展的內(nèi)置對象支持存在差異。

開發(fā)者需要避免使用 JavaScript 引擎不支持的內(nèi)置對象。 如果必須使用,可自己提供內(nèi)置對象的 polyfill(Polyfill :用于實現(xiàn)瀏覽器或其他 JavaScript 引擎不支持的原生 API 的代碼 )。

注意:小程序引擎中禁止訪問 globalThis、global ,因此無法直接使用 babel-polyfill。

客戶端操作系統(tǒng)對 ES6 擴展內(nèi)置對象支持情況

下表是各個操作系統(tǒng)對 ES6 擴展的內(nèi)置對象的支持情況:

Object iOS 8 iOS 9 iOS 10 及以上 Android
Object.is 不支持 支持 支持 支持
Object.assign 不支持 支持 支持 支持
Object.keys 支持 支持 支持 支持
Object.getOwnPropertyDescriptor 支持 支持 支持 支持
Object.getOwnPropertyNames 支持 支持 支持 支持
Object.getOwnPropertySymbols 不支持 支持 支持 支持

String iOS 8 iOS 9 iOS 10 及以上 Android
String.prototype.codePointAt 不支持 支持 支持 支持
String.prototype.normalize 不支持 不支持 支持 支持
String.prototype.includes 不支持 支持 支持 支持
String.prototype.startsWith 不支持 支持 支持 支持
String.prototype.endsWith 不支持 支持 支持 支持
String.prototype.repeat 不支持 支持 支持 支持
String.fromCodePoint 不支持 支持 支持 支持

Array iOS 8 iOS 9 iOS 10 及以上 Android
Array.prototype.copyWithin 不支持 支持 支持 支持
Array.prototype.find 支持 支持 支持 支持
Array.prototype.findIndex 支持 支持 支持 支持
Array.prototype.fill 支持 支持 支持 支持
Array.prototype.entries 支持 支持 支持 支持
Array.prototype.keys 支持 支持 支持 支持
Array.prototype.values 不支持 支持 支持 不支持
Array.prototype.includes 不支持 支持 支持 支持
Array.from 不支持 支持 支持 支持
Array.of 不支持 支持 支持 支持

Number iOS 8 iOS 9 iOS 10 及以上 Android
Number.isFinite 不支持 支持 支持 支持
Number.isNaN 不支持 支持 支持 支持
Number.parseInt 不支持 支持 支持 支持
Number.parseFloat 不支持 支持 支持 支持
Number.isInteger 不支持 支持 支持 支持
Number.EPSILON 不支持 支持 支持 支持
Number.isSafeInteger 不支持 支持 支持 支持

Math iOS 8 iOS 9 iOS 10 及以上 Android
Math.trunc 支持 支持 支持 支持
Math.sign 不支持 支持 支持 支持
Math.cbrt 支持 支持 支持 支持
Math.clz32 支持 支持 支持 支持
Math.imul 支持 支持 支持 支持
Math.fround 支持 支持 支持 支持
Math.hypot 支持 支持 支持 支持
Math.expm1 支持 支持 支持 支持
Math.log1p 支持 支持 支持 支持
Math.log10 支持 支持 支持 支持
Math.log2 支持 支持 支持 支持
Math.sinh 支持 支持 支持 支持
Math.cosh 支持 支持 支持 支持
Math.tanh 支持 支持 支持 支持
Math.asinh 支持 支持 支持 支持
Math.acosh 支持 支持 支持 支持
Math.atanh 支持 支持 支持 支持

內(nèi)置對象 iOS 8 iOS 9 iOS 10及以上 Android
Set 支持 支持 支持 支持
Map 支持 支持 支持 支持
Proxy 不支持 不支持 支持 支持
Reflect 不支持 不支持 支持 支持
Promise 支持 支持 支持 支持

對動態(tài)執(zhí)行腳本的限制

出于安全考慮,小程序限制了部分 ES 的語法和 API :

  • 不支持 eval 使用
  • setTimeout 和 setInterval 函數(shù)僅支持函數(shù)做回調(diào)參數(shù),不可動態(tài)執(zhí)行代碼
  • 不支持使用 new Function 創(chuàng)建函數(shù)

模塊名保留字

小程序的邏輯層支持 ES2015 模塊化語法,但是將瀏覽器部分內(nèi)置對象名(如 window、document)作保留字使用,以應(yīng)對未來的不時之需,這些保留字不可用做模塊名。保留字有:globalThis、global、AlipayJSBridge、fetch、self、window、document、location、XMLHttpRequest。更多詳情請參見 框架概述 中對模塊名保留字的介紹。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號