當心酌畜,babel 處理 Symbol 的麻煩

在使用 babel 轉(zhuǎn)換 ES next 代碼的時候,并不會將 Symbol 直接轉(zhuǎn)換成 ES5 中對應的內(nèi)容穆律,需要引入額外的 polyfill 才能正常工作。

有的團隊為了避免引入這個額外的 polyfill 导俘,會選擇不使用 Symbol 峦耘,包括通過 babel 生成 Symbol 的特性(比如 for of 等)。

這時候就會有個比較隱蔽的地方需要注意旅薄,就是盡量不要讓 babel 生成這樣的代碼:

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

這個里面包含了一個 Symbol 辅髓,為了讓 Symbol 不至于報錯,又要想辦法在全局先聲明一下 Symbol 變量少梁,比較丑陋利朵。

目前在實踐中,發(fā)現(xiàn)這樣的 ES next 代碼會生成上述代碼:

function fn1() {
    if (1) {
        let a = 1;
        filter(function fn() {
            console.log(a);
        });
        return;
    }
}

生成的代碼為:

"use strict";

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

function fn1() {
    if (1) {
        var _ret = function () {
            var a = 1;
            filter(function fn() {
                console.log(a);
            });
            return {
                v: void 0
            };
        }();

        if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v;
    }
}

這段代碼有什么特征呢猎莲?就是在 if 塊中定義了函數(shù)绍弟,函數(shù)中訪問了 if 塊中的“塊級變量”,并且 if 塊使用了 return 語句著洼。

可以看出樟遣,babel 為了保證 if 塊內(nèi)變量的作用域,會套一個匿名函數(shù)身笤,同時由于 if 塊中存在 return 返回豹悬,所以就用 _ret 來接收匿名函數(shù)的返回值。然后后面為啥會生成那串長長的對 _ret 的類型判斷代碼液荸,目前還不太清楚瞻佛,可能要結(jié)合 babel 的內(nèi)部處理邏輯去看了,單從生成的代碼看娇钱,這個完全是多余的伤柄。

推而廣之, for 塊等局部非函數(shù)作用域都會有類似的問題文搂。

實際上适刀,從代碼編寫規(guī)范角度來看,是不應該在這種局部作用域塊里面定義函數(shù)的煤蹭。函數(shù)應該是一段通用的代碼笔喉,不應該縮在那一小塊里面取视。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市常挚,隨后出現(xiàn)的幾起案子作谭,更是在濱河造成了極大的恐慌,老刑警劉巖奄毡,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢早,死亡現(xiàn)場離奇詭異,居然都是意外死亡秧倾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門傀缩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來那先,“玉大人,你說我怎么就攤上這事赡艰∈鄣” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵慷垮,是天一觀的道長揖闸。 經(jīng)常有香客問我,道長料身,這世上最難降的妖魔是什么汤纸? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮芹血,結(jié)果婚禮上贮泞,老公的妹妹穿的比我還像新娘。我一直安慰自己幔烛,他們只是感情好啃擦,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饿悬,像睡著了一般令蛉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狡恬,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天珠叔,我揣著相機與錄音,去河邊找鬼弟劲。 笑死运杭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的函卒。 我是一名探鬼主播辆憔,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼撇眯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虱咧?” 一聲冷哼從身側(cè)響起熊榛,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腕巡,沒想到半個月后玄坦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绘沉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年煎楣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片车伞。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡择懂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出另玖,到底是詐尸還是另有隱情困曙,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布谦去,位于F島的核電站慷丽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳄哭。R本人自食惡果不足惜要糊,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妆丘。 院中可真熱鬧杨耙,春花似錦、人聲如沸飘痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宣脉。三九已至车柠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塑猖,已是汗流浹背竹祷。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羊苟,地道東北人塑陵。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蜡励,于是被迫代替她去往敵國和親令花。 傳聞我的和親對象是個殘疾皇子阻桅,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容