国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

閉包及其應用

alexnevsky / 2428人閱讀

摘要:閉包帶來的問題內存占用由于閉包使用其它函數內的變量,所以垃圾回收機制不會對閉包相關的函數進行回收,占用內存空間。

什么是閉包?

“在函數內使用其它函數內的變量,是為閉包”

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

在例 1 中,a 為外層函數,a中返回了一個內部函數 b , 函數 b 中使用了 a 中的 num 變量。此時,函數 b 就形成了一個閉包。

閉包的用處是什么?

在JavaScript中,作用域鏈使得子作用域能夠讀取到父作用域的變量【見例2】,而反過來,父作用域無法直接獲取子作用域的變量【見例3】。

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



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

答:那就在函數內部再定一個函數,將其作為返回值即可【例4】。

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

例 4 中,函數 b 作為函數 a 的內部函數,可以訪問 a 中的變量 num,于是我們將函數 b 作為返回值,我們通過操作 b 來訪問 a 的變量。

上述利用閉包的特性來實現外部對內部的訪問,便是閉包最基本的應用。

閉包的應用場景
1. 封裝變量以控制權限

一般來說,我們只想讓外界使用我們暴露出去的方法,而方法涉及到的變量計算想要封裝在函數內部,以避免被有意/無意地修改變量值,此時,便可利用閉包來進行變量封裝以控制權限【例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 ,然后通過使用 firstVisit 進行判斷,因為暴露給外界使用的是 firstVisit 函數,所以只能使用該函數定義的方法,而無法對 _list 進行任何修改,保證了數據的私密性。

2. 函數柯里化

函數柯里化就是把一個函數接收多個參數進行處理,轉變為接收單一參數,然后返回一個新函數接收下一個參數【見例6】。

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

這里函數柯里化后的內部函數所使用的 x,就是其父作用域的變量,此時的內部函數就是一個閉包。

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

// 檢驗是否含有數字
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

通過上例可以看到,直接使用check函數,第一個參數“正則判斷語句”在每次使用時都需要輸入,既不美觀也不方便。對其進行函數柯里化后,只需輸入一次正則判斷語句,便可對判斷函數進行復用。

閉包帶來的問題
內存占用

由于閉包使用其它函數內的變量,所以垃圾回收機制不會對閉包相關的函數進行回收,占用內存空間。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104309.html

相關文章

  • JavaScript基礎系列---閉包及其應用

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

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

    摘要:執行環境變量對象活動對象作用域鏈執行環境,為簡單起見,有時也稱為環境是中最為重要的一個概念。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。閉包垃圾回收機制先介紹下垃圾回收機制。 執行環境、變量對象 / 活動對象、作用域鏈 執行環境(executioncontext,為簡單起見,有時也稱為環境)是JavaScript中最為重要的一個概念。執行環境定義了變量或函數有...

    EastWoodYang 評論0 收藏0
  • JS之閉包及其作用

    摘要:如上述代碼所顯示,閉包是需要函數套函數,其實只是因為我們需要局部變量,否則此變量就會變成全局變量,無法隱藏。閉包的作用可以間接調用函數內部的局部變量。 前言 閉包作為JS中的一大難點,相信許多小伙伴也常常為此疑惑,閉包到底是什么?它有什么用呢? 變量作用域 在學習閉包之前,你必須清楚知道JS中變量的作用域。JS中變量的作用域無非就全局變量和局部變量,兩者之間的關系是函數內部可以直接訪...

    junnplus 評論0 收藏0
  • 詳解js閉包

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

    Chiclaim 評論0 收藏0
  • Django Web開發技術棧清單-Python基礎篇

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

    leeon 評論0 收藏0

發表評論

0條評論

alexnevsky

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<