日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

根據 MDN:“閉包是捆綁在一起(封閉)的函數及其周圍狀態(詞法環境)的引用的組合。換句話說,閉包使您可以從內部函數訪問外部函數的作用域。在 JAVAScript 中,每次創建函數時都會創建閉包。”

什么是閉包?

根據 MDN:“閉包是捆綁在一起(封閉)的函數及其周圍狀態(詞法環境)的引用的組合。換句話說,閉包使您可以從內部函數訪問外部函數的作用域。在 JavaScript 中,每次創建函數時都會創建閉包。”

例如:

const getShowName = () => {
  const name = "fatfish" // name is a local variable created by getShowName


  return () => {
    console.log(name) // use variable declared in the parent function
  }
}


const showName = getShowName()

showName() // fatfish

作為前端開發工程師,我們在很多場景中都會用到它,它的功能確實很強大。

1. 解決循環中的問題

for (var i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i) // What will i print out?
  }, 1000 * i)
}

我們怎樣才能讓它打印0、1、2呢?

是的,你可以使用閉包來解決這個問題。它很快就會打印出 0、1 和 2。

for (var i = 0; i < 3; i++) {
  ((n) => {
    setTimeout(() => {
      console.log(n) // What will i print out?
    }, 1000 * n)
  })(i)
}

當然,我們還有另一種更簡單的方法,只需將var替換為let即可解決這個問題。

for (let i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i) // What will i print out?
  }, 1000 * i)
}

2.記憶功能

利用閉包的特性,我們可以減少計算量,提高我們編寫的程序的性能。

const memoize = (callback) => {
  const cache = new Map()


  return function (n) {
    if (cache.has(n)) { // When it already exists in the cache, the result will be returned directly, we don't need to calculate it agAIn
      return cache.get(n)
    } else {
      const res = callback.call(this, n)
      cache.set(n, res) // After the first calculation, the result will be cached
      return res
    }
  }
}
const fibonacci = memoize(function fib (n) {
  if (n === 1) {
    return 1
  }
  if (n === 2 || n === 3) {
    return 2
  }
  return fib(n - 1) + fib(n - 2)
})


console.log(fibonacci(1)) // 1
console.log(fibonacci(10)) // 68
console.log(fibonacci(10)) // 68 Read from cache instead of computing again

3. 封裝私有變量和屬性

很早以前,我們經常通過閉包來實現對私有變量的保護。

我們只能通過getName和setName來獲取和設置_name的值。

這樣我們就可以有效防止_name被惡意修改。

const createName = (name) => {
  let _name = name


  return {
    getName () {
      return _name
    },
    setName (name) {
      _name = name
    }
  }
}
const p = createName('fatfish')
p.getName() // fatfish
p.setName('medium')
p.getName() // medium

4.函數柯里化

作為一名前端開發工程師,我相信你已經了解了什么是函數柯里化。讓我們嘗試使用閉包來實現它。

const curry = (callback, ...args) => {
  return function (...innerArgs) {
    innerArgs = args.concat(innerArgs)


    if (innerArgs.length >= callback.length) {
      return callback.Apply(this, innerArgs)
    } else {
      return curry(callback, innerArgs)
    }
  }
}


const add = curry((a, b, c) => {
  return a + b + c
}, 1)
console.log(add(2, 3)) // 6

太好了,我們做到了,那你還知道閉包的其他用途嗎?

分享到:
標簽:JavaScript
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定