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

資訊專欄INFORMATION COLUMN

閉包及其應(yīng)用

alexnevsky / 2487人閱讀

摘要:閉包帶來(lái)的問(wèn)題內(nèi)存占用由于閉包使用其它函數(shù)內(nèi)的變量,所以垃圾回收機(jī)制不會(huì)對(duì)閉包相關(guān)的函數(shù)進(jìn)行回收,占用內(nèi)存空間。

什么是閉包?

“在函數(shù)內(nèi)使用其它函數(shù)內(nèi)的變量,是為閉包”

【例1】
function a() {
    let num = 100;
    return function b() {
        console.log(num)
    }
}
var c = a()
c()   // 100

在例 1 中,a 為外層函數(shù),a中返回了一個(gè)內(nèi)部函數(shù) b , 函數(shù) b 中使用了 a 中的 num 變量。此時(shí),函數(shù) b 就形成了一個(gè)閉包。

閉包的用處是什么?

在JavaScript中,作用域鏈?zhǔn)沟米幼饔糜蚰軌蜃x取到父作用域的變量【見(jiàn)例2】,而反過(guò)來(lái),父作用域無(wú)法直接獲取子作用域的變量【見(jiàn)例3】。

【例2】
let num = 100
function a() {
    console.log(num)
}
a()   // 100



【例3】
function a() {
    let num = 100
}
console.log(num)   // error: not defined
當(dāng)我們想在父作用域使用子作用域的值時(shí)該怎么辦呢?

答:那就在函數(shù)內(nèi)部再定一個(gè)函數(shù),將其作為返回值即可【例4】。

【例4】
function a() {
    let num = 100
    return function b() {
        return num
    }
}
var x = a()
console.log(x())   // 100

例 4 中,函數(shù) b 作為函數(shù) a 的內(nèi)部函數(shù),可以訪問(wèn) a 中的變量 num,于是我們將函數(shù) b 作為返回值,我們通過(guò)操作 b 來(lái)訪問(wèn) a 的變量。

上述利用閉包的特性來(lái)實(shí)現(xiàn)外部對(duì)內(nèi)部的訪問(wèn),便是閉包最基本的應(yīng)用。

閉包的應(yīng)用場(chǎng)景
1. 封裝變量以控制權(quán)限

一般來(lái)說(shuō),我們只想讓外界使用我們暴露出去的方法,而方法涉及到的變量計(jì)算想要封裝在函數(shù)內(nèi)部,以避免被有意/無(wú)意地修改變量值,此時(shí),便可利用閉包來(lái)進(jìn)行變量封裝以控制權(quán)限【例5】。

【例5】
// 判斷輸入的變量是否是第一次輸入
function isFirstVisit() {
    let _list = []
    return function (id) {
        if (_list.indexOf(id) >= 0) {
            console.log("Exist!")
        } else {
            _list.push(id)
            console.log("Added~")
        }
    }
}
let firstVisit = isFirstVisit()
firstVisit(5)   // Added~
firstVisit(5)   // Exist!
firstVisit(10)   // Added~

將 isFirstVisit 的返回值賦給 firstVisit ,然后通過(guò)使用 firstVisit 進(jìn)行判斷,因?yàn)楸┞督o外界使用的是 firstVisit 函數(shù),所以只能使用該函數(shù)定義的方法,而無(wú)法對(duì) _list 進(jìn)行任何修改,保證了數(shù)據(jù)的私密性。

2. 函數(shù)柯里化

函數(shù)柯里化就是把一個(gè)函數(shù)接收多個(gè)參數(shù)進(jìn)行處理,轉(zhuǎn)變?yōu)榻邮諉我粎?shù),然后返回一個(gè)新函數(shù)接收下一個(gè)參數(shù)【見(jiàn)例6】。

【例6】
// 普通函數(shù)
function sum(x, y) {
    return x + y
}
// 函數(shù)柯里化
function curryingSum(x) {
    return function(y) {
        return x + y
    }
}

這里函數(shù)柯里化后的內(nèi)部函數(shù)所使用的 x,就是其父作用域的變量,此時(shí)的內(nèi)部函數(shù)就是一個(gè)閉包。

函數(shù)柯里化應(yīng)用之 參數(shù)復(fù)用
【例7】 
function check(reg, txt) {
    return reg.test(txt)
}

// 檢驗(yàn)是否含有數(shù)字
check(/d+/g, "test")   // false
check(/d+/g, "abc")   // false
check(/d+/g, "2dd")   // true

// 柯里化后
function curryingCheck(reg) {
    return function(txt) {
        return reg.test(txt)
    }
}

let hasNumber = curryingCheck(/d+/g)

hasNumber("test")      // false
hasNumber("abc")   // false
hasNumber("2dd")   // true

通過(guò)上例可以看到,直接使用check函數(shù),第一個(gè)參數(shù)“正則判斷語(yǔ)句”在每次使用時(shí)都需要輸入,既不美觀也不方便。對(duì)其進(jìn)行函數(shù)柯里化后,只需輸入一次正則判斷語(yǔ)句,便可對(duì)判斷函數(shù)進(jìn)行復(fù)用。

閉包帶來(lái)的問(wèn)題
內(nèi)存占用

由于閉包使用其它函數(shù)內(nèi)的變量,所以垃圾回收機(jī)制不會(huì)對(duì)閉包相關(guān)的函數(shù)進(jìn)行回收,占用內(nèi)存空間。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/104309.html

相關(guān)文章

  • JavaScript基礎(chǔ)系列---閉包及其應(yīng)用

    摘要:所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。所以本文中將以維基百科中的定義為準(zhǔn)即在計(jì)算機(jī)科學(xué)中,閉包,又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。 閉包(closure)是JavaScript中一個(gè)神秘的概念,許多人都對(duì)它難以理解,我也一直處于似懂非懂的狀態(tài),前幾天深入了解了一下執(zhí)行環(huán)境以及作用域鏈,可戳查看詳情,而閉包與作用域及作用域鏈的關(guān)系密不可分,所...

    leoperfect 評(píng)論0 收藏0
  • 作用域鏈、垃圾回收機(jī)制、閉包及其應(yīng)用(oop)

    摘要:執(zhí)行環(huán)境變量對(duì)象活動(dòng)對(duì)象作用域鏈執(zhí)行環(huán)境,為簡(jiǎn)單起見(jiàn),有時(shí)也稱為環(huán)境是中最為重要的一個(gè)概念。作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。閉包垃圾回收機(jī)制先介紹下垃圾回收機(jī)制。 執(zhí)行環(huán)境、變量對(duì)象 / 活動(dòng)對(duì)象、作用域鏈 執(zhí)行環(huán)境(executioncontext,為簡(jiǎn)單起見(jiàn),有時(shí)也稱為環(huán)境)是JavaScript中最為重要的一個(gè)概念。執(zhí)行環(huán)境定義了變量或函數(shù)有...

    EastWoodYang 評(píng)論0 收藏0
  • JS之閉包及其作用

    摘要:如上述代碼所顯示,閉包是需要函數(shù)套函數(shù),其實(shí)只是因?yàn)槲覀冃枰植孔兞浚駝t此變量就會(huì)變成全局變量,無(wú)法隱藏。閉包的作用可以間接調(diào)用函數(shù)內(nèi)部的局部變量。 前言 閉包作為JS中的一大難點(diǎn),相信許多小伙伴也常常為此疑惑,閉包到底是什么?它有什么用呢? 變量作用域 在學(xué)習(xí)閉包之前,你必須清楚知道JS中變量的作用域。JS中變量的作用域無(wú)非就全局變量和局部變量,兩者之間的關(guān)系是函數(shù)內(nèi)部可以直接訪...

    junnplus 評(píng)論0 收藏0
  • 詳解js閉包

    摘要:但閉包的情況不同嵌套函數(shù)的閉包執(zhí)行后,,然后還在被回收閉包會(huì)使變量始終保存在內(nèi)存中,如果不當(dāng)使用會(huì)增大內(nèi)存消耗。每個(gè)函數(shù),不論多深,都可以認(rèn)為是全局的子作用域,可以理解為閉包。 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 閉包的特性 閉包有三個(gè)特性: 1.函數(shù)嵌套函數(shù) 2.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量 3.參數(shù)和變量不會(huì)...

    Chiclaim 評(píng)論0 收藏0
  • Django Web開(kāi)發(fā)技術(shù)棧清單-Python基礎(chǔ)篇

    摘要:使用單引號(hào)雙引號(hào)和三引號(hào)或來(lái)表示字符串。不可變的集合函數(shù)會(huì)以字典類型返回當(dāng)前位置的全部全局變量。用于將進(jìn)制整數(shù)轉(zhuǎn)換成進(jìn)制,以字符串形式表示。返回字符串中最大的字母,或數(shù)組中的最大值。的作用就是減少了單行函數(shù)的定義。 問(wèn)題答案由本人整理 1.基礎(chǔ)語(yǔ)法是否熟悉?介紹一下 Python和其他語(yǔ)言最大的區(qū)別就是使用行和縮進(jìn),而不是大括號(hào)({})或者分號(hào)(;)來(lái)控制類、函數(shù)或者邏輯判斷。Pyt...

    leeon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<