成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

一個由于Function.name造成的兼容性bug

Cobub / 3096人閱讀

摘要:最近遇到一個,在調用的接口時,有一個接口需要傳遞函數(shù)名過去,在中我已經傳遞了函數(shù)名過去,但是在部分及以下的安卓手機以及上發(fā)現(xiàn),并沒有收到我傳遞函數(shù)名,函數(shù)名為空,百思不得其解,后來瀏覽了上對的解釋后,修復了這個。

最近遇到一個bug,在調用APP的js接口時,有一個接口需要傳遞函數(shù)名過去,在js中我已經傳遞了函數(shù)名過去,但是在部分Android6.0及以下的安卓手機以及iOS 8上發(fā)現(xiàn),APP并沒有收到我傳遞函數(shù)名,函數(shù)名為空,百思不得其解,后來瀏覽了MDN上對function.name的解釋后,修復了這個bug。

項目基于VUE2.X開發(fā),語法大部分使用ES6。

具體如下:

//需要傳遞給APP的函數(shù)
let callbackFn = {
    fn: () => {
        //...
    }
}

//調用APP的js接口
nativeAPI.call(callbackFn.fn.name)

簡單的邏輯如上所示,但是在與安卓開發(fā)和iOS開發(fā)聯(lián)調時,他們告訴我,在低版本手機中,我傳過去的回調函數(shù)名稱callbackFn.fn.name值為空字符串!就是說我并有獲取到function的名字!

經過思考,嘗試了以下幾種辦法

1. 檢查webpack中babel-polyfill及babel的配置,使打包后的代碼兼容更多的設備

經過檢查,webpack中確實引入了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"]
}

結果:然而發(fā)現(xiàn)并沒有解決問題。

2.放棄es6的箭頭語法,手動改寫js函數(shù)

將callbackFn改為

var callbackFn = {
    fn: function() {
        //...
    }
}

結果:還是不行

3.將回調函數(shù)的js文件放到static文件夾中,不參與混淆打包

因為js的混淆會改變變量名,為了避免可能發(fā)生的錯誤,將回調函數(shù)多帶帶挪到static文件夾中,不參與打包
結果:失敗

4.改寫獲取函數(shù)名的方式

因為步驟3的失敗,讓我感覺問題可能沒有出在打包過程中,直覺告訴我,我獲取函數(shù)名的方法(function.name)可能有問題,于是去MDN搜索了一下,確實有所收獲。
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ù)
function callbackFn() {
    //...
}

//獲取函數(shù)名稱
let callbackName = callbackFn.name

//調用APP的js接口
nativeAPI.call(callbackName)

至此,這個問題解決了。

總結:
1.需要傳遞函數(shù)名的時候,最好顯式的聲明函數(shù),否則依賴瀏覽器推斷函數(shù)名的話不可靠,瀏覽器種類眾多,不能確定是否實現(xiàn)了這個標準;
2.盡量避免使用傳遞函數(shù)名這種方式來做為回調函數(shù),因為經過壓縮混淆時會改變函數(shù)名,這種做法不可靠。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/98305.html

相關文章

  • 軟件測試理論

    摘要:軟件測試是為了降低存在缺陷的可能性,即便是沒有找到缺陷,也不能證明軟件是完美的。軟件測試中存在原則的缺陷發(fā)現(xiàn)在的模塊中。軟件測試不僅是找出缺陷,同時也需要確認軟件是否滿足需求。 4.1軟件缺陷定義 軟件缺陷就是通常說的bug,它是指在軟件中存在的影響 *軟件未達到產品說明書標明的功能, *軟...

    劉永祥 評論0 收藏0

發(fā)表評論

0條評論

Cobub

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<