最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中閉包的4個有用技巧分享

 更新時間:2023年10月25日 09:28:43   作者:黑土豆  
當(dāng)談到JavaScript編程中的高級概念和技巧時,閉包(Closures)是一個重要而有趣的主題,閉包是一種函數(shù)與其創(chuàng)建時的詞法環(huán)境的組合,它允許我們捕獲和保留局部變量,并在函數(shù)之外使用它們,在這篇文章中,我們將深入探討JavaScript中閉包的4種有用技巧

前言

當(dāng)談到JavaScript編程中的高級概念和技巧時,閉包(Closures)是一個重要而有趣的主題。閉包是一種函數(shù)與其創(chuàng)建時的詞法環(huán)境的組合,它允許我們捕獲和保留局部變量,并在函數(shù)之外使用它們。在這篇文章中,我們將深入探討JavaScript中閉包的4種有用技巧,以及如何應(yīng)用它們來解決各種問題和提高代碼質(zhì)量。

1. 解決循環(huán)中的問題

JavaScript中,循環(huán)中的變量作用域問題經(jīng)常會導(dǎo)致預(yù)期之外的結(jié)果。通常,使用var聲明變量會導(dǎo)致循環(huán)中的變量共享相同的作用域,因此在異步操作中,這些變量可能會具有意外的值。

問題場景:

for (var i = 0; i < 3; i++) {
    setTimeout(() => {
        console.log(i); // 輸出什么?
    }, 1000 * i);
}

上述代碼將在1秒、2秒和3秒后分別打印出3,三次都是相同的值。這是因?yàn)?code>setTimeout是異步的,它在循環(huán)結(jié)束后才執(zhí)行,此時i的值已經(jīng)是3。

解決方法:

使用閉包來保存每次迭代中的i的值:

for (var i = 0; i < 3; i++) {
    ((n) => {
        setTimeout(() => {
            console.log(n); // 輸出0、1、2
        }, 1000 * n);
    })(i);
}

或者,更簡單的方式是使用let來聲明循環(huán)變量,它將在每次迭代中創(chuàng)建一個新的作用域:

for (let i = 0; i < 3; i++) {
    setTimeout(() => {
        console.log(i); // 輸出0、1、2
    }, 1000 * i);
}

2種方法都可以解決循環(huán)中的作用域問題。

2. 保存函數(shù)狀態(tài)

閉包還可以用于實(shí)現(xiàn)記憶功能,通過緩存計算結(jié)果來提高性能。這在需要重復(fù)計算的函數(shù)中特別有用。

問題場景:

實(shí)現(xiàn)一個累加器:

let sum = 1;

function add(num) {
    sum += num;
    return sum;
}

console.log(add(1));
console.log(add(5));

每次調(diào)用add時,它都會將上次的值保存下來。但是這段代碼有潛在的問題,那就是sum可能會被其他部分代碼無意中修改。那如何解決?

解決方法:

使用閉包就可以規(guī)避上面存在的問題且可以緩存已經(jīng)計算的值:

function calculator(val) {
    let sum = val;
    return function(num) {
        sum += num;
        return sum;
    }
}
const add = calculator(1);
console.log(add(1)); //2
console.log(add(5)); //7

每次調(diào)用返回的函數(shù)時,它都會將傳遞給它的數(shù)字加到總和中,并返回新的總和。

3. 封裝私有變量和屬性

在過去,為了保護(hù)對象的私有變量,常常使用閉包。通過閉包,可以將變量封裝在函數(shù)內(nèi)部,只能通過函數(shù)暴露的接口來訪問和修改。

問題場景:

function add() {
    let count = 0;
    count++;
    console.log(count);
}
add(); //輸出1
add(); //輸出1
add(); //輸出1

調(diào)用函數(shù),輸出的結(jié)果都是1,但是顯然我們想要的效果是讓count每次加1的。那如何解決呢?

解決方法:

使用閉包來封裝私有變量:

function add(){
    let count = 0;
    function a() {
        count++;
        console.log(count);
    }
    return a;
}
var res = add();
res() //1
res() //2
res() //3

add函數(shù)返回了一個閉包a,其中包含了count變量。由于count只在add函數(shù)內(nèi)部定義,因此外部無法直接訪問它。但是,由于a函數(shù)引用了count變量,因此count變量的值可以在閉包內(nèi)部被修改和訪問,這樣就可以防止它被惡意修改了。

4. 函數(shù)柯里化

函數(shù)柯里化是一種將接受多個參數(shù)的函數(shù)轉(zhuǎn)化為一系列接受一個參數(shù)的函數(shù)的過程。這也可以通過閉包來實(shí)現(xiàn)。

問題場景:

const add = (a, b, c) => {
    return a + b + c;
}

console.log(add(2, 3, 4)); // 輸出9

解決方法:

使用閉包來實(shí)現(xiàn)函數(shù)柯里化:

function curry(callback) {
    const args = [];

    return function curried(...newArgs) {
        args.push(...newArgs);

        if (args.length >= callback.length) {
            return callback(...args);
        } else {
            return curried;
        }
    };
}

function add(a, b, c) {
    return a + b + c;
}

const curriedAdd = curry(add);

console.log(curriedAdd(2)(3)(4)); // 輸出 9

函數(shù)柯里化使函數(shù)更加靈活,能夠逐步接受參數(shù),提高代碼的可重用性和可讀性。

總結(jié)

在本文中,我們深入探討了JavaScript中閉包的4種有用技巧,以及如何應(yīng)用它們來解決各種問題和提高代碼質(zhì)量。這些技巧包括解決循環(huán)中的變量作用域問題,實(shí)現(xiàn)記憶功能以提高性能,封裝私有變量和屬性,以及使用函數(shù)柯里化來提高函數(shù)的靈活性。

閉包是JavaScript中一個強(qiáng)大的概念,它允許我們在函數(shù)之外訪問和操作局部變量,從而解決了許多常見的編程問題。雖然閉包在JavaScript中有著廣泛的應(yīng)用,但也需要小心使用,以避免潛在的內(nèi)存泄漏問題。確保在不再需要閉包時,及時釋放對其的引用,以幫助垃圾回收器正常運(yùn)作。希望本文對你理解JavaScript中的閉包和如何應(yīng)用它們有所幫助。

以上就是JavaScript中閉包的4個有用技巧分享的詳細(xì)內(nèi)容,更多關(guān)于JavaScript閉包的有用技巧的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js 分頁代碼帶切換效果

    js 分頁代碼帶切換效果

    js 分頁效果實(shí)現(xiàn)代碼,可以切換頁面
    2009-06-06
  • 分享11個常用JavaScript小技巧

    分享11個常用JavaScript小技巧

    在我們的日常開發(fā)過程中,我們經(jīng)常會遇到數(shù)字與字符串轉(zhuǎn)換,檢查對象中是否存在對應(yīng)值,條件性操作對象數(shù)據(jù),過濾數(shù)組中的錯誤值,等等這類處理。本文整理出了一些常用的小技巧,希望大家能喜歡
    2022-06-06
  • javascript里使用php代碼實(shí)例

    javascript里使用php代碼實(shí)例

    這篇文章主要介紹了javascript里使用php代碼的方法,以實(shí)例形式展示了javascript與php代碼混編的應(yīng)用技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2014-12-12
  • js隨機(jī)密碼產(chǎn)生函數(shù)

    js隨機(jī)密碼產(chǎn)生函數(shù)

    在網(wǎng)上找了好多隨機(jī)產(chǎn)生的密碼的代碼,沒一個好用的,所以就隨便寫了一個
    2010-08-08
  • js使用visibilitychange處理頁面關(guān)閉事件

    js使用visibilitychange處理頁面關(guān)閉事件

    本文主要介紹了js使用visibilitychange處理頁面關(guān)閉事件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • js使用navigator.userAgent判斷當(dāng)前瀏覽器所處的環(huán)境

    js使用navigator.userAgent判斷當(dāng)前瀏覽器所處的環(huán)境

    本文主要介紹了js使用navigator.userAgent判斷當(dāng)前瀏覽器所處的環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • JS前端開發(fā)之exec()和match()的對比使用

    JS前端開發(fā)之exec()和match()的對比使用

    match()方法可在字符串內(nèi)檢索指定的值,或找到一個或多個正則表達(dá)式的匹配,下面這篇文章主要給大家介紹了關(guān)于JS前端開發(fā)之exec()和match()的對比使用的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 通過js給網(wǎng)頁加上水印背景實(shí)例

    通過js給網(wǎng)頁加上水印背景實(shí)例

    這篇文章主要介紹了通過js給網(wǎng)頁加上水印背景實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • LayUi使用switch開關(guān),動態(tài)的去控制它是否被啟用的方法

    LayUi使用switch開關(guān),動態(tài)的去控制它是否被啟用的方法

    今天小編就為大家分享一篇LayUi使用switch開關(guān),動態(tài)的去控制它是否被啟用的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • html的DOM中document對象images集合用法實(shí)例

    html的DOM中document對象images集合用法實(shí)例

    這篇文章主要介紹了html的DOM中document對象images集合用法,實(shí)例分析了images集合的語法與使用技巧,需要的朋友可以參考下
    2015-01-01

最新評論

青海省| 卢氏县| 唐海县| 卢湾区| 佛山市| 东源县| 义马市| 砀山县| 宝应县| 进贤县| 凭祥市| 玛纳斯县| 溧阳市| 普兰店市| 五莲县| 南汇区| 云霄县| 巨野县| 梁山县| 山东省| 亳州市| 黎川县| 金华市| 凤台县| 乌鲁木齐县| 永康市| 石林| 乌兰县| 交城县| 宜兰县| 华宁县| 富蕴县| 太康县| 康马县| 泽库县| 济宁市| 赞皇县| 花垣县| 镇坪县| 洞头县| 九江县|