• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    匿名函數是一把雙刃劍,有利也有弊

    來源:懂視網 責編:小采 時間:2020-11-27 20:17:39
    文檔

    匿名函數是一把雙刃劍,有利也有弊

    匿名函數是一把雙刃劍,有利也有弊:作為函數式編程語言,函數在JavaScript中的重要地位和巨大作用你盡可想象。但在其提供巨大便利的同時,也不可避免的帶來巨大的問題。匿名函數則更是一把雙刃劍,它讓函數式編程語言更加完美,也讓代碼更加難于閱讀。你應該知道匿名函數是以犧牲語義化為巨大代
    推薦度:
    導讀匿名函數是一把雙刃劍,有利也有弊:作為函數式編程語言,函數在JavaScript中的重要地位和巨大作用你盡可想象。但在其提供巨大便利的同時,也不可避免的帶來巨大的問題。匿名函數則更是一把雙刃劍,它讓函數式編程語言更加完美,也讓代碼更加難于閱讀。你應該知道匿名函數是以犧牲語義化為巨大代

    作為函數式編程語言,函數在JavaScript中的重要地位和巨大作用你盡可想象。但在其提供巨大便利的同時,也不可避免的帶來巨大的問題。

    匿名函數則更是一把雙刃劍,它讓函數式編程語言更加完美,也讓代碼更加難于閱讀。你應該知道匿名函數是以犧牲語義化為巨大代價的。

    如果一個函數沒有名字,它可能無關緊要,在大部分場景中它都將失去意義。函數的名字跟你的名字,你朋友的名字,你家小寵物的名字一樣,是重要關鍵的,否則你寫它干嘛。

    即使在看起來最沒有必要的位置使用命名函數也有巨大價值

    你可能隨手就能枚舉很多場景來證明匿名函數的便利性,不可否認有些場景無疑是有一些道理的,但大多數人以此為起點,以善小而不為。比如

    Array.some, Array.forEach, String.replace

    這樣的例子能舉出不少,我們也可以理直氣壯的說他們不需要使用命名函數,使用匿名函數更方便,并且大家都是這么做的。但是別忘了,some,forEach,replace本身已經具有寬泛的語義了。但仍然可以更近一步:

    1.Array.some, 廣泛的語義是找出數組中是否有一些,但究竟有一些什么呢?

    2.Array.forEach, 廣泛的語義是遍歷,Array提供無數的函數用于遍歷,你為什么選擇forEach, 而不是map,every等等?

    3.String.replace, 廣泛的語義是替換,但究竟是將什么替換成什么呢?

    代碼是寫給人看的,

    1.能不能不要讓我去讀你的代碼猜或者推理出來你要從數組中找出一些什么,是不是有整數,是不是有空值?

    2.能不能直接通過函數名告訴我你遍歷這個數組是想干什么?

    3.能不能直接通過函數名告訴我你想將什么替換成什么?

    舉個簡單的例子,找出價格數組中是否存在整數價格。isInteger可能是已經有的公共函數,如果沒有的話,經過你就有了。簡潔易讀,在閱讀主流程的時候,有些代碼是不需要閱讀的,isInteger就是這樣一些代碼,萬一有錯呢?isInteger是可測易測的,如果你不放心,對它執行單元測試。你可能已經注意到,一個小小的改變,有一部分代碼已經具有可測性了。即使這里不是一個公用函數,寫成命名函數也更整潔更可測。

    var isAnyInteger = priceArr.some(Common.isInteger.bind(Common));

    這些都是非常極端的被認為是可以直接寫匿名函數的例子,但很明顯可以看到,他們也可以作為命名函數的邊界處理,即都寫命名函數百利而無一害,只會更好。

    再簡單的代碼也要區分架構和實現

    另外一個重災區是 then 函數,匿名函數的代碼不能更丑陋,即使大家都這么寫,你也應該明白,你不能這么寫,正確的姿勢應該寫成這樣, 以展示訂單為例:

    /*
     * name : getOrder
     * description : 獲取訂單數據 */function getOrder()
    {//{{{var url = 'https://www.qunar.com/getOrder';//假如收集參數比較費勁,應該用一個函數專門去收集參數var params = getOrderParams();//假如參數體比較龐大,應該先將其賦予一個變量var params = {
     orderNo:'248663058'};//無論如何,現將參數賦予變量你都將獲得在這里打印變量方便調試的便利console.log('getOrder url & params:', url, params);return $.post(url, params);
    }//}}}/*
     * name : renderOrder
     * description : 拿訂單,拿到就在頁面上展示出來,拿不到就告訴用戶為什么沒拿到 */function renderOrder()
    {//{{{//高級函數,只安排工作,不自己實現//getOrder() 對該函數來說是不可見的,它要的只是訂單數據,偷得搶的都可以 getOrder().then(render, remindUser);
    }//}}}function render()
    {//{{{}//}}}function remindUser()
    {//{{{}//}}}

    當然,你可能覺得 renderOrder 就是雞肋,跟只拿工資不干活的領導簡直一毛一樣,把then寫在 $.post 后面不就行了?

    不行,如果有一天獲取訂單既可以從本地獲取,又可以從本地緩存獲取,那么getOrder就升級為次高級函數,它管理兩個函數 getOrderFromServer, getOrderFromCache

    如果在獲取訂單之前或者之后還要做一些事情,那之后renderOrder能夠從容應付。

    想都不要想過度設計這個詞,大部分人沒有這個能力,不必杞人憂天。

    你從一開始就是高級架構師只不過兼職寫代碼

    你可以清楚的看到,大量使用命名函數讓代碼結構非常清晰,任何人都能容易的獨懂主流程,任何人都可以容易的去實現每一個命名函數,要實現什么已經清楚的寫在了函數名上了。

    這些命名函數就像房屋的骨架,再往上堆疊就是一棟樓的骨架,你見過建筑設計師自己砌墻澆水泥的嗎?寫代碼也一樣,用函數堆疊成骨架,至于每個函數怎么實現,請幫我實現(在你初學的時候就是請你自己幫你自己實現)。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    匿名函數是一把雙刃劍,有利也有弊

    匿名函數是一把雙刃劍,有利也有弊:作為函數式編程語言,函數在JavaScript中的重要地位和巨大作用你盡可想象。但在其提供巨大便利的同時,也不可避免的帶來巨大的問題。匿名函數則更是一把雙刃劍,它讓函數式編程語言更加完美,也讓代碼更加難于閱讀。你應該知道匿名函數是以犧牲語義化為巨大代
    推薦度:
    標簽: 一把 有利 雙刃劍
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品国精品国产自在久国产应用男| 午夜精品免费在线观看| 97久久久久人妻精品专区| 国产午夜福利精品久久| 久久国产精品成人影院| 麻豆国产高清精品国在线| 色播精品免费小视频| 久久九九精品99国产精品| 亚洲爆乳无码精品AAA片蜜桃| 99在线精品免费视频| 国产精品你懂得| 国产欧美亚洲精品A| 亚洲国产精品一区二区第一页| 韩国三级中文字幕hd久久精品| 欧美一卡2卡3卡四卡海外精品| 国产精品亚韩精品无码a在线| 亚洲国产精品无码专区在线观看| 久久精品无码一区二区三区免费 | 999久久久免费精品国产| 2021年精品国产福利在线| 日韩人妻精品一区二区三区视频 | 日韩欧美精品不卡| 国产精品无码无需播放器| 亚洲国产精品无码久久久秋霞2 | 国产线视频精品免费观看视频| 精品一区二区久久久久久久网站| 日韩精品久久久久久免费| 三级国产精品| 久久久久亚洲精品无码网址| 国产999精品久久久久久| 华人在线精品免费观看| 国产午夜福利精品久久2021| 久久亚洲精品国产精品| 亚洲国产精品无码久久久秋霞2 | 亚洲国语精品自产拍在线观看| 国产精品视频一区二区三区无码| 亚洲欧洲久久久精品| 日本精品一区二区久久久| 精品日本一区二区三区在线观看 | 精品国产午夜肉伦伦影院| 久久成人影院精品777|