Javascript 关闭; return 是强制性的吗?

Javascript closure; is the return manatory?

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

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;
    }

}

update- 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;
    }

}

函数 countermakeCounter 的局部函数。您不能在 makeCounter.

范围之外调用该函数

counter中的returnreturn是count值到makeCounter的范围。所以你需要一个 return,就像在第一个例子中一样,然后 return 来自 makeCounter.

的值

在您的具体示例中,您必须 return 局部函数 counter 才能创建闭包。

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

如果您查看第一个示例中的 makeCounter() 是如何使用的,它会是这样的:

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

仅从预期用途来看,显然 makeCounter() 必须 return 一个函数才能发挥作用。


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


所以,在这个例子中:

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

var myCntr = makeCounter();

仍在范围内的 myCntr 变量和一个活动变量包含对内部 counter() 函数的引用,该函数又包含对 makeCounter() 中内部范围变量的引用。这种对内部作用域的持久引用告诉 JS 解释器和垃圾收集器 makeCounter() 本地作用域不能被垃圾收集并且将持续存在。这个概念叫做闭包。

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

中是一个非常有用的功能