做爰高潮a片〈毛片〉,尤物av天堂一区二区在线观看,一本久久A久久精品VR综合,添女人荫蒂全部过程av

最新文章專題視頻專題問答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
當前位置: 首頁 - 科技 - 知識百科 - 正文

關于JavaScript中高階函數(shù)的魅力詳解

來源:懂視網 責編:小采 時間:2020-11-27 22:08:08
文檔

關于JavaScript中高階函數(shù)的魅力詳解

關于JavaScript中高階函數(shù)的魅力詳解:前言 一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),簡言之,函數(shù)的參數(shù)能夠接收別的函數(shù),這種函數(shù)就稱之為高階函數(shù) JavaScript 的高階函數(shù)跟 Swift 的高階函數(shù)類似 常見的高階函數(shù)有: Map、Reduce、Filter、Sort 高階函數(shù)是指至少滿足下列條件之一的函數(shù) 1:函
推薦度:
導讀關于JavaScript中高階函數(shù)的魅力詳解:前言 一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),簡言之,函數(shù)的參數(shù)能夠接收別的函數(shù),這種函數(shù)就稱之為高階函數(shù) JavaScript 的高階函數(shù)跟 Swift 的高階函數(shù)類似 常見的高階函數(shù)有: Map、Reduce、Filter、Sort 高階函數(shù)是指至少滿足下列條件之一的函數(shù) 1:函

生硬的看概念不太好理解,我們來看接下來的例子

我們需要一個函數(shù)來計算一年12個月的消費,在每個月月末的時候我們都要計算消費了多少錢。正常代碼如下

// 未柯里化的函數(shù)計算開銷
let totalCost = 0
const cost = function(amount, mounth = '') {
 console.log(`第${mounth}月的花銷是${amount}`)
 totalCost += amount
 console.log(`當前總共消費:${totalCost}`)
}
cost(1000, 1) // 第1個月的花銷
cost(2000, 2) // 第2個月的花銷
// ...
cost(3000, 12) // 第12個月的花銷

總結一下不難發(fā)現(xiàn),如果我們要計算一年的總消費,沒必要計算12次。只需要在年底執(zhí)行一次計算就行,接下來我們對這個函數(shù)進行部分柯里化的函數(shù)幫助我們理解

// 部分柯里化完的函數(shù)
const curringPartCost = (function() {
 // 參數(shù)列表
 let args = []
 return function (){
 /**
 * 區(qū)分計算求值的情況
 * 有參數(shù)的情況下進行暫存
 * 無參數(shù)的情況下進行計算
 */
 if (arguments.length === 0) {
 let totalCost = 0
 args.forEach(item => {
 totalCost += item[0]
 })
 console.log(`共消費:${totalCost}`)
 return totalCost
 } else {
 // argumens并不是數(shù)組,是一個類數(shù)組對象
 let currentArgs = Array.from(arguments)
 args.push(currentArgs)
 console.log(`暫存${arguments[1] ? arguments[1] : '' }月,金額${arguments[0]}`)
 }
 }
})()
curringPartCost(1000,1)
curringPartCost(100,2)
curringPartCost()

接下來我們編寫一個通用的curring, 以及一個即將被curring的函數(shù)。代碼如下

// 通用curring函數(shù)
const curring = function(fn) {
 let args = []
 return function () {
 if (arguments.length === 0) {
 console.log('curring完畢進行計算總值')
 return fn.apply(this, args)
 } else {
 let currentArgs = Array.from(arguments)[0]
 console.log(`暫存${arguments[1] ? arguments[1] : '' }月,金額${arguments[0]}`)
 args.push(currentArgs)
 // 返回正被執(zhí)行的 Function 對象,也就是所指定的 Function 對象的正文,這有利于匿名函數(shù)的遞歸或者保證函數(shù)的封裝性
 return arguments.callee
 }
 }
}
// 求值函數(shù)
let costCurring = (function() {
 let totalCost = 0
 return function () {
 for (let i = 0; i < arguments.length; i++) {
 totalCost += arguments[i]
 }
 console.log(`共消費:${totalCost}`)
 return totalCost
 }
})()
// 執(zhí)行curring化
costCurring = curring(costCurring)
costCurring(2000, 1)
costCurring(2000, 2)
costCurring(9000, 12)
costCurring()

函數(shù)節(jié)流

JavaScript中的大多數(shù)函數(shù)都是用戶主動觸發(fā)的,一般情況下是沒有性能問題,但是在一些特殊的情況下不是由用戶直接控制。容易大量的調用引起性能問題。畢竟DOM操作的代價是非常昂貴的。下面將列舉一些這樣的場景:

  • window.resise事件。
  • mouse, input等事件。
  • 上傳進度
  • ...
  • 下面通過高階函數(shù)的方式我們來實現(xiàn)函數(shù)節(jié)流

    /**
    * 節(jié)流函數(shù)
    * @param {*} fn 
    * @param {*} interval 
    */
    const throttle = function (fn, interval = 500) {
     let timer = null, // 計時器 
     isFirst = true // 是否是第一次調用
     return function () {
     let args = arguments, _me = this
     // 首次調用直接放行
     if (isFirst) {
     fn.apply(_me, args)
     return isFirst = false
     }
     // 存在計時器就攔截
     if (timer) {
     return false
     }
     // 設置timer
     timer = setTimeout(function (){
     console.log(timer)
     window.clearTimeout(timer)
     timer = null
     fn.apply(_me, args)
     }, interval)
     }
    }
    // 使用節(jié)流
    window.onresize = throttle(function() {
     console.log('throttle')
    },600)

    分時函數(shù)

    節(jié)流函數(shù)為我們提供了一種限制函數(shù)被頻繁調用的解決方案。下面我們將遇到另外一個問題,某些函數(shù)是用戶主動調用的,但是由于一些客觀的原因,這些操作會嚴重的影響頁面性能,此時我們需要采用另外的方式去解決。

    如果我們需要在短時間內才頁面中插入大量的DOM節(jié)點,那顯然會讓瀏覽器吃不消。可能會引起瀏覽器的假死,所以我們需要進行分時函數(shù),分批插入。

    /**
    * 分時函數(shù)
    * @param {*創(chuàng)建節(jié)點需要的數(shù)據(jù)} list 
    * @param {*創(chuàng)建節(jié)點邏輯函數(shù)} fn 
    * @param {*每一批節(jié)點的數(shù)量} count 
    */
    const timeChunk = function(list, fn, count = 1){
     let insertList = [], // 需要臨時插入的數(shù)據(jù)
     timer = null // 計時器
     const start = function(){
     // 對執(zhí)行函數(shù)逐個進行調用
     for (let i = 0; i < Math.min(count, list.length); i++) {
     insertList = list.shift()
     fn(insertList)
     }
     }
     return function(){
     timer = setInterval(() => {
     if (list.length === 0) {
     return window.clearInterval(timer)
     }
     start()
     },200)
     }
    }
    // 分時函數(shù)測試
    const arr = []
    for (let i = 0; i < 94; i++) {
     arr.push(i)
    }
    const renderList = timeChunk(arr, function(data){
     let div =document.createElement('div')
     div.innerHTML = data + 1
     document.body.appendChild(div)
    }, 20)
    renderList()

    惰性加載函數(shù)

    在Web開發(fā)中,因為一些瀏覽器中的差異,一些嗅探工作總是不可避免的。

    因為瀏覽器的差異性,我們要常常做各種各樣的兼容,舉一個非常簡單常用的例子:在各個瀏覽器中都能夠通用的事件綁定函數(shù)。
    常見的寫法是這樣的:

    // 常用的事件兼容
    const addEvent = function(el, type, handler) {
     if (window.addEventListener) {
     return el.addEventListener(type, handler, false)
     }
     // for IE
     if (window.attachEvent) {
     return el.attachEvent(`on${type}`, handler)
     }
    }
    這個函數(shù)存在一個缺點,它每次執(zhí)行的時候都會去執(zhí)行if條件分支。雖然開銷不大,但是這明顯是多余的,下面我們優(yōu)化一下, 提前一下嗅探的過程:
    const addEventOptimization = (function() {
     if (window.addEventListener) {
     return (el, type, handler) => {
     el.addEventListener(type, handler, false)
     }
     }
     // for IE
     if (window.attachEvent) {
     return (el, type, handler) => {
     el.attachEvent(`on${type}`, handler)
     }
     }
    })()

    這樣我們就可以在代碼加載之前進行一次嗅探,然后返回一個函數(shù)。但是如果我們把它放在公共庫中不去使用,這就有點多余了。下面我們使用惰性函數(shù)去解決這個問題:

    // 惰性加載函數(shù)
    let addEventLazy = function(el, type, handler) {
     if (window.addEventListener) {
     // 一旦進入分支,便在函數(shù)內部修改函數(shù)的實現(xiàn)
     addEventLazy = function(el, type, handler) {
     el.addEventListener(type, handler, false)
     }
     } else if (window.attachEvent) {
     addEventLazy = function(el, type, handler) {
     el.attachEvent(`on${type}`, handler)
     }
     }
     addEventLazy(el, type, handler)
    }
    addEventLazy(document.getElementById('eventLazy'), 'click', function() {
     console.log('lazy ')
    })

    一旦進入分支,便在函數(shù)內部修改函數(shù)的實現(xiàn),重寫之后函數(shù)就是我們期望的函數(shù),在下一次進入函數(shù)的時候就不再存在條件分支語句。

    總結

    該文章主要是讀《Javascript設計模式》的總結。

    代碼地址

    好了,

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

    文檔

    關于JavaScript中高階函數(shù)的魅力詳解

    關于JavaScript中高階函數(shù)的魅力詳解:前言 一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),簡言之,函數(shù)的參數(shù)能夠接收別的函數(shù),這種函數(shù)就稱之為高階函數(shù) JavaScript 的高階函數(shù)跟 Swift 的高階函數(shù)類似 常見的高階函數(shù)有: Map、Reduce、Filter、Sort 高階函數(shù)是指至少滿足下列條件之一的函數(shù) 1:函
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 荣成市| 漠河县| 株洲市| 滨海县| 定安县| 孟村| 涞水县| 桃园县| 垫江县| 长乐市| 德阳市| 关岭| 白城市| 昌邑市| 始兴县| 军事| 镇赉县| 板桥市| 鹤庆县| 景泰县| 平陆县| 肥东县| 曲阜市| 德安县| 太保市| 汉阴县| 镇康县| 喜德县| 龙川县| 东阿县| 漳浦县| 新民市| 西丰县| 荣昌县| 桐柏县| 泰州市| 昌都县| 孝昌县| 龙游县| 房山区| 喜德县|