由于闭包是绑定到其词法环境的函数,我想知道为什么notAClosure构造不是闭包:

let a = { b: 42 };
let notAClosure = ( param ) => { param.b++ };
let aClosure = () => { a.b++ };
notAClosure(a);


调用notAClosure时,我们通过引用将其传递给对象a。这意味着现在在闭包内部,我们可以访问外部范围=词法环境。
我的功能名称正确吗? aClosure是真正的闭包吗? notAClosure真的不是闭包吗,如果正确,那么为什么?

最佳答案

您的变量命名是正确的。

notAClosure的函数主体实际上未引用其自身范围之外的任何内容。函数aClosure确实引用了超出其自身范围的变量,即a

a传递给notAClosure by-value-by-reference。这将在a函数主体的直接范围内放置对notAClosure的“值”引用,因为param是一个参数。

aClosure中,本地范围内没有a;而是(强制)引用外部范围中的a函数。一个稍微复杂一点的示例,以使其变得明显而变得封闭:

let x = (function() {
    let a = { b: 42 };
    return () => { a.b++; };
})();


x被分配给立即返回另一个功能的功能。 x在返回的lambda函数的关闭中“隐藏” a。在不调用a的情况下无法以任何方式访问x,但是a仍存在于内存中,因为它可以在返回的lambda的外部范围(即范围)内访问。

10-05 22:34