JavaScript的闭包

本文详细解析了JavaScript中闭包的概念,通过实例说明了闭包如何保持对父级函数变量的引用,避免垃圾回收,形成特殊的内存管理机制。并介绍了闭包在IIFE、模块化、防抖和节流函数等场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是闭包

通俗一点来讲:A函数中包含B函数,在A函数执行完之后,B函数还保持着对A函数 变量对象 的引用,就叫做闭包。

如果实在要概括出来,之前有本书的一句话写的很好,我拿出来分享一下:

函数记住并认得它的词法作用域,当它在当前词法作用域之外执行时,闭包就产生了

 

举个例子:

function out() {
    var a = 3;

    function in() {
        console.log(a);        
    }
}

var obj = out();
obj.in();

在这里,out函数运行之后,按照道理来说,a这个变量应该被当作垃圾回收了,但是in函数还保持着对它的引用,所以它不会被回收,这里就形成了一个闭包。

 

如果参照刚才系统的定义,in函数定义在out函数的词法作用域,但是它不在out函数的词法作用域中运行,所以满足闭包的条件。

 

二、闭包的应用

 

1. IIFE

立即执行函数表达式是用来避免变量污染的一个很重要的应用,但其实它并不很符合闭包的概念,因为函数还是依旧运行在定义的作用域里。

(function() {
    //...
})()

 

2. 实现模块化

var module = function() {
    var modules = {};

    function define(name, deps, impl) {
        for (var i = 0; i < deps.length; i++) {
            deps[i] = modules[deps[i]];
        }
        modules[name] = impl.apply(impl, deps);
    }

    function get(name) {
        return modules[name];
    }

    return {
        define: define,
        get: get
    }
}

 

3. 防抖函数

function debounce(fn, delay) {
    var timer;
    return function() {
        if(timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(function() {
            fn.apply(this, arguments);
        }, delay);
    }
}

 

4. 节流函数

function throttle(fn, delay) {
    var lastTime = 0;
    return function() {
        var now = +new Date();
        if (now - lastTime > delay) {
            lastTime = now;
            fn.apply(this, arguments);
        }
    }
}

 

以上就是对于闭包的分析

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值