Javascript闭包;是返回强制

Javascript closure; is the return manatory?

本文关键字:返回 闭包 Javascript      更新时间:2023-09-26

我试图学习这个概念,但我不确定回报。 目前在我看到的示例中(其中许多看起来像下面)这是关闭,但我不明白为什么我应该返回计数器,它是强制性的还是不是关闭的?

function makeCounter() {
    var count = 0;
    function counter() {
        count = count + 1;
        return count;
    }
    return counter;
}

喜欢这个

function makeCounter() {
    var count = 0;
    function counter() {
        count = count + 1;
        return count;
    }
}

更新 - makeCounter 仍然是 clousre

function makeCounter() {
    var count = 0;
    function counter() {
        count = count + 1;
        return count;
    }
    return counter;
    var count2 = 0;
    function counter2() {
        count2 = count2 + 1;
        return count2;
    }
}

在您的特定示例中,您必须返回本地函数counter才能创建闭包。

在第二个代码示例中,makeCounter()不返回任何内容,因此不会创建闭包。 事实上,makeCounter()甚至什么都不做,因为counter()从来没有被调用过。

如果您查看如何使用第一个示例中的makeCounter(),它将如下所示:

var myCntr = makeCounter();
var firstCnt = myCntr();
var secondCnt = myCntr();

仅从预期的用法来看,很明显,makeCounter()必须返回一个函数才能有用。


Javascript 中的闭包是在函数本身完成执行很久之后,当某些代码继续保留对函数作用域中任何内容的引用时创建的。 这可以通过从函数返回本地函数来实现,如第一个代码示例所示。 或者,当存在可以在将来某个时间调用的异步回调函数或事件处理程序包含在函数中时,可能会发生这种情况。


因此,在此示例中:

function makeCounter() {
    var count = 0;
    function counter() {
        count = count + 1;
        return count;
    }
    return counter;
}
var myCntr = makeCounter();

仍在作用域中的 myCntr 变量和活变量包含对内部 counter() 函数的引用,而该函数又包含对 makeCounter() 中内部作用域变量的引用。 这种对内部作用域的持久引用告诉 JS 解释器和垃圾回收器,makeCounter()本地作用域不能进行垃圾回收,并且会持续存在。 这个概念称为闭包。

一种对我来说很有效的简单思考方式是只从垃圾收集的角度来考虑它。 在 JS 中,当没有代码仍然引用该变量并且因此任何内容都不能再使用该变量时,变量有资格进行垃圾回收。 函数作用域也是如此。 如果您将函数作用域视为进行垃圾回收的对象,则仅当没有仍在运行但仍具有对它的引用的代码时,才能对函数作用域进行垃圾回收。 返回内部函数并将该返回值存储到变量中会创建对该内部作用域的引用,因此只要该变量本身仍然存在,那么函数作用域就不能被垃圾回收,并且将继续处于活动状态。 这个概念称为闭包。 它并不存在于所有语言中,但在Javascript中是一个非常有用的功能。

>函数counter是要makeCounter的局部函数。您不能在 makeCounter 范围内调用该函数。

counter 中的返回将count值返回到 makeCounter 的范围。因此,您需要一个返回值,就像在第一个示例中一样,然后从 makeCounter 返回值。