由于闭包是绑定到其词法环境的函数,我想知道为什么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的外部范围(即范围)内访问。