📜  JavaScript - 闭包 - Javascript (1)

📅  最后修改于: 2023-12-03 15:01:36.682000             🧑  作者: Mango

JavaScript - 闭包 - Javascript

什么是闭包?

闭包指的是可以访问另外一个函数作用域中变量的函数,闭包的核心就在于它如何查找变量。当一个函数被调用时,会先从自身作用域查找变量,如果找不到,会从父级作用域查找变量,直到找到全局作用域为止。

闭包的应用
实现私有变量

由于 JavaScript 中没有访问修饰符(如 private、protected、public 等),可以通过闭包来实现私有变量的效果。

示例代码如下:

function Person() {
    var name = "Tom"; // 私有变量
    this.getName = function() {
        return name;
    };
    this.setName = function(newName) {
        name = newName;
    };
}

在该示例代码中,name 这个变量是 Person 函数内部的私有变量,外界无法直接访问。但是通过 this.getNamethis.setName 可以间接访问和修改该变量。

生成计数器

利用闭包可以生成一个计数器,每次调用该计数器函数,计数器的值会自增 1。同时,这个计数器的值是被保留下来的,不会受到外部变量的影响。

示例代码如下:

function counter() {
    var count = 0;
    return function() {
        return ++count;
    };
}
var c = counter();
console.log(c()); // 输出 1
console.log(c()); // 输出 2
console.log(c()); // 输出 3

在该示例代码中,counter 函数返回了一个函数,而这个函数可以访问到 counter 函数内部的变量 count。由于闭包的特性,每次调用返回的函数时,都会自增 count 的值,达到计数的效果。

延迟执行

对于一些需要实现延时执行的操作,也可以借助闭包来实现。

示例代码如下:

function delayExecute(callback, time) {
    return function() {
        setTimeout(callback, time);
    };
}
var func = delayExecute(function() {
    console.log("延迟执行");
}, 1000);
func(); // 1 秒后执行

在该示例代码中,delayExecute 函数返回了一个函数,而这个函数中又调用了一个 setTimeout 函数,实现了延迟执行的效果。

总结

闭包是 JavaScript 中一个非常重要的特性,在很多场合下都能够发挥重要作用。需要注意的是,闭包虽然能够带来方便,但是也可能存在内存泄漏的问题,因此在使用时需要谨慎。