日韩欧美人妻无码精品白浆,夜夜嗨AV免费入口,国产欧美官网在线看,高校回应聋哑女生因长相完美被质疑

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

天使還是魔鬼?6年老司機(jī)帶你玩轉(zhuǎn)js閉包

freeflydom
2025年6月6日 9:18 本文熱度 71

一、閉包是什么?一個簡單的例子

function outer() {
    let me = '小楊';
    return function inner() {
        console.log(`大家好,我是${me}`);
    };
}
const sayHello = outer();
sayHello(); // "大家好,我是小楊"

看到?jīng)]?inner函數(shù)記住了outer函數(shù)的me變量,這就是閉包!

二、閉包的三大妙用(天使面)

1. 創(chuàng)建私有變量

function createCounter() {
    let count = 0;
    return {
        increment() { count++ },
        getCount() { return count }
    };
}
const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 1
console.log(counter.count); // undefined

2. 實(shí)現(xiàn)函數(shù)柯里化

function multiply(a) {
    return function(b) {
        return a * b;
    };
}
const double = multiply(2);
console.log(double(5)); // 10

3. 事件處理中的妙用

function setupButtons() {
    for(var i = 1; i <= 3; i++) {
        (function(index) {
            document.getElementById(`btn-${index}`)
                .addEventListener('click', function() {
                    console.log(`我是按鈕${index}`);
                });
        })(i);
    }
}

三、閉包的三大坑(魔鬼面)

1. 內(nèi)存泄漏

function leakMemory() {
    const bigData = new Array(1000000).fill('*');
    return function() {
        console.log('我還記得bigData');
    };
}
const leaked = leakMemory();
// bigData本應(yīng)該被回收,但閉包讓它一直存在

2. 性能問題

function slowPerformance() {
    const data = {}; // 大對象
    return function(key, value) {
        data[key] = value;
        // 每次調(diào)用都要訪問閉包變量
    };
}

3. 意外的變量共享

function createFunctions() {
    let funcs = [];
    for(var i = 0; i < 3; i++) {
        funcs.push(function() {
            console.log(i); // 全是3!
        });
    }
    return funcs;
}

四、閉包優(yōu)化六大法則(6年經(jīng)驗(yàn)總結(jié))

1. 及時釋放引用

function createHeavyObject() {
    const heavy = new Array(1000000).fill('*');
    return {
        useHeavy: function() {
            // 使用heavy
        },
        cleanup: function() {
            heavy = null; // 手動釋放
        }
    };
}

2. 使用塊級作用域

// 修復(fù)前面的共享變量問題
function createFixedFunctions() {
    let funcs = [];
    for(let i = 0; i < 3; i++) { // 使用let
        funcs.push(function() {
            console.log(i); // 0,1,2
        });
    }
    return funcs;
}

3. 避免不必要的閉包

// 不好的寫法
function unneededClosure() {
    const data = {};
    return function() {
        // 根本不使用data,卻形成了閉包
        console.log('Hello');
    };
}
// 好的寫法
function noClosure() {
    console.log('Hello');
}

4. 使用WeakMap管理私有變量

const privateData = new WeakMap();
class MyClass {
    constructor() {
        privateData.set(this, {
            secret: '我是私有數(shù)據(jù)'
        });
    }
    
    getSecret() {
        return privateData.get(this).secret;
    }
}

5. 合理使用IIFE

// 立即執(zhí)行函數(shù)減少閉包生命周期
(function() {
    const tempData = processData();
    // 使用tempData
})(); // 執(zhí)行完立即釋放

6. 使用模塊化

// 模塊化天然適合管理閉包
const counterModule = (function() {
    let count = 0;
    
    return {
        increment() { count++ },
        getCount() { return count }
    };
})();

五、真實(shí)案例分享

案例1:我曾經(jīng)在項(xiàng)目中遇到一個頁面卡頓問題,最后發(fā)現(xiàn)是因?yàn)橐粋€事件處理函數(shù)形成了閉包,持有了一個大DOM樹的引用。解決方案是:

// 修復(fù)前
function setup() {
    const bigElement = document.getElementById('big');
    button.addEventListener('click', function() {
        // 持有bigElement引用
        console.log(bigElement.id);
    });
}
// 修復(fù)后
function setup() {
    const id = 'big';
    button.addEventListener('click', function() {
        // 只存儲需要的id
        console.log(id);
    });
}

六、總結(jié)

閉包就像一把雙刃劍:
? 優(yōu)點(diǎn):實(shí)現(xiàn)私有變量、函數(shù)柯里化、模塊化等
? 缺點(diǎn):可能導(dǎo)致內(nèi)存泄漏、性能問題

記住我的6年經(jīng)驗(yàn)總結(jié):

  1. 及時釋放不再需要的引用
  2. 優(yōu)先使用塊級作用域
  3. 避免不必要的閉包
  4. 合理使用WeakMap和模塊化
  5. 善用開發(fā)者工具檢查內(nèi)存

轉(zhuǎn)自https://juejin.cn/post/7512259761196957707


該文章在 2025/6/6 9:18:57 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved