闭包的定义与作用(含举例)

闭包

1.什么是闭包

闭包 是指在一个函数内部定义的函数可以访问该函数作用域内的变量,及时在外部函数执行完毕后,内部函数仍然可以访问到这些变量。 换句话说,闭包使得函数可以记住并访问其词法作用域内的变量,即使在其定义的词法作用域之外执行。 (函数在定义时,他所能访问的变量都已经确定了)

2.闭包的作用

  1. 封装变量
  2. 保持状态
  3. 延长作用域链
  4. 实现回调和异步编程
  • 封装变量: 闭包可以将变量私有化,只暴露必要的接口,实现了变量的封装,增强了安全性。
function createCounter() {
    var count = 0;
  
    return {
        increment: function() {
            count++;
        },
        getCount: function() {
            return count;
        }
    };
}

var counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 输出:1

createCounter 函数返回一个对象,该对象包含两个方法 incrementgetCount,这两个方法都可以访问 createCounter 内部的 count 变量。外部无法直接访问 count 变量,从而实现了变量的封装。

  • 保持状态: 由于闭包可以访问外部函数的变量,因此可以在函数之间共享状态,实现状态的持久化。
function createLogger(name) {
    return function(message) {
        console.log(`[${name}] ${message}`);
    };
}

var infoLogger = createLogger('INFO');
infoLogger('This is an info message.'); // 输出:[INFO] This is an info message.

在这个例子中,createLogger 函数返回一个函数,这个返回的函数被称为日志记录器。每次调用 createLogger 时,都会创建一个新的日志记录器,并且这个日志记录器可以记住传入 createLoggername 参数。每个日志记录器都可以独立地记录日志,从而保持了状态。

  • 延长作用域链: 闭包可以使函数访问其定义时所在的作用域,实现对外部变量的引用,延长了作用域链。
function addSuffix(suffix) {
    return function(name) {
        return name + suffix;
    };
}

var addLy = addSuffix('ly');
console.log(addLy('quick')); // 输出:quickly

在这个例子中,addSuffix 函数返回一个函数,该函数将给定的后缀添加到传入的名称上。addLy 函数是 addSuffix 的一个特定实例,它将 ‘ly’ 后缀添加到名称中。即使 addSuffix 函数执行完毕后,addLy 仍然可以访问传入的后缀,因为它形成了闭包,延长了作用域链。

  • 实现回调和异步编程: 闭包可以用于创建回调函数,用于处理异步任务,例如事件监听、定时器等。
function fetchData(url, callback) {
    // 模拟异步请求
    setTimeout(function() {
        var data = 'Some data from ' + url;
        callback(data);
    }, 1000);
}

fetchData('https://example.com/api', function(data) {
    console.log('Data received:', data);
});

fetchData 函数执行异步请求,并在请求完成后调用传入的回调函数。这种方式允许我们将逻辑分离,使得我们的代码更具可读性和可维护性。

你可能感兴趣的:(前端,javascript)