摘要:最近遇到一個(gè),在調(diào)用的接口時(shí),有一個(gè)接口需要傳遞函數(shù)名過去,在中我已經(jīng)傳遞了函數(shù)名過去,但是在部分及以下的安卓手機(jī)以及上發(fā)現(xiàn),并沒有收到我傳遞函數(shù)名,函數(shù)名為空,百思不得其解,后來瀏覽了上對(duì)的解釋后,修復(fù)了這個(gè)。
最近遇到一個(gè)bug,在調(diào)用APP的js接口時(shí),有一個(gè)接口需要傳遞函數(shù)名過去,在js中我已經(jīng)傳遞了函數(shù)名過去,但是在部分Android6.0及以下的安卓手機(jī)以及iOS 8上發(fā)現(xiàn),APP并沒有收到我傳遞函數(shù)名,函數(shù)名為空,百思不得其解,后來瀏覽了MDN上對(duì)function.name的解釋后,修復(fù)了這個(gè)bug。
項(xiàng)目基于VUE2.X開發(fā),語法大部分使用ES6。
具體如下:
//需要傳遞給APP的函數(shù) let callbackFn = { fn: () => { //... } } //調(diào)用APP的js接口 nativeAPI.call(callbackFn.fn.name)
簡單的邏輯如上所示,但是在與安卓開發(fā)和iOS開發(fā)聯(lián)調(diào)時(shí),他們告訴我,在低版本手機(jī)中,我傳過去的回調(diào)函數(shù)名稱callbackFn.fn.name值為空字符串!就是說我并有獲取到function的名字!
經(jīng)過思考,嘗試了以下幾種辦法
1. 檢查webpack中babel-polyfill及babel的配置,使打包后的代碼兼容更多的設(shè)備經(jīng)過檢查,webpack中確實(shí)引入了babel-polyfill
module.exports = { context: path.resolve(__dirname, "../"), entry: { app: ["babel-polyfill", "./src/main.js"] }, ...
.babelrc文件中配置如下
{ "presets": [ ["env", { "modules": false, "targets": { "browsers": ["last 2 versions", "safari >= 7"] } }], "stage-0" ], "plugins": ["transform-vue-jsx", "transform-runtime"] }
結(jié)果:然而發(fā)現(xiàn)并沒有解決問題。
2.放棄es6的箭頭語法,手動(dòng)改寫js函數(shù)將callbackFn改為
var callbackFn = { fn: function() { //... } }
結(jié)果:還是不行
3.將回調(diào)函數(shù)的js文件放到static文件夾中,不參與混淆打包因?yàn)閖s的混淆會(huì)改變變量名,為了避免可能發(fā)生的錯(cuò)誤,將回調(diào)函數(shù)多帶帶挪到static文件夾中,不參與打包
結(jié)果:失敗
因?yàn)椴襟E3的失敗,讓我感覺問題可能沒有出在打包過程中,直覺告訴我,我獲取函數(shù)名的方法(function.name)可能有問題,于是去MDN搜索了一下,確實(shí)有所收獲。
Function.name - JavaScript | MDN
推斷函數(shù)名稱
變量和方法可以從句法位置推斷匿名函數(shù)的名稱(ECMAScript 2015中新增)。
var f = function() {}; var object = { someMethod: function() {} }; console.log(f.name); // "f" console.log(object.someMethod.name); // "someMethod"
注意描述:(ECMAScript 2015中新增)
這讓我極度懷疑,在函數(shù)名的傳遞過程中,可能瀏覽器并沒有幫我“推斷”,也許取到的還是匿名函數(shù),所以我獲取函數(shù)名時(shí),獲取的是空字符串,于是我開始手動(dòng)改寫,代碼如下:
//聲明函數(shù) function callbackFn() { //... } //獲取函數(shù)名稱 let callbackName = callbackFn.name //調(diào)用APP的js接口 nativeAPI.call(callbackName)
至此,這個(gè)問題解決了。
總結(jié):
1.需要傳遞函數(shù)名的時(shí)候,最好顯式的聲明函數(shù),否則依賴瀏覽器推斷函數(shù)名的話不可靠,瀏覽器種類眾多,不能確定是否實(shí)現(xiàn)了這個(gè)標(biāo)準(zhǔn);
2.盡量避免使用傳遞函數(shù)名這種方式來做為回調(diào)函數(shù),因?yàn)榻?jīng)過壓縮混淆時(shí)會(huì)改變函數(shù)名,這種做法不可靠。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98305.html
摘要:軟件測(cè)試是為了降低存在缺陷的可能性,即便是沒有找到缺陷,也不能證明軟件是完美的。軟件測(cè)試中存在原則的缺陷發(fā)現(xiàn)在的模塊中。軟件測(cè)試不僅是找出缺陷,同時(shí)也需要確認(rèn)軟件是否滿足需求。 4.1軟件缺陷定義 軟件缺陷就是通常說的bug,它是指在軟件中存在的影響 *軟件未達(dá)到產(chǎn)品說明書標(biāo)明的功能, *軟...
閱讀 2808·2021-11-24 09:38
閱讀 2052·2019-08-30 15:53
閱讀 1395·2019-08-30 15:44
閱讀 3298·2019-08-30 14:10
閱讀 3686·2019-08-29 16:29
閱讀 1881·2019-08-29 16:23
閱讀 1170·2019-08-29 16:20
閱讀 1553·2019-08-29 11:13