因为闭包是一个与它的词汇环境绑定的函数,我想知道为什么notAClosure
构造不是一个闭包:
let a = { b: 42 };
let notAClosure = ( param ) => { param.b++ };
let aClosure = () => { a.b++ };
notAClosure(a);
当notAClosure
被调用时,我们通过引用传递给它a
对象。这意味着现在在闭包内我们可以访问外部scope = lexical环境。
我的功能是否正确? aClosure
是真正的封闭吗? notAClosure
真的不是一个闭包,如果是正确的 - 为什么呢?
答案 0 :(得分:1)
您的变量命名是正确的。
aClosure
的函数体实际上并未引用其自身范围之外的任何内容。函数a
确实引用其自身范围之外的变量,即a
。
notAClosure
已传递给a
by-value-by-reference。这会在notAClosure
函数体的直接范围内对param
进行“值”引用,因为aClosure
是一个参数。
在a
内,本地范围内没有a
;相反,该函数被(强制)引用外部范围中的let x = (function() {
let a = { b: 42 };
return () => { a.b++; };
})();
。一个稍微复杂的例子,为什么它成为一个闭包更明显:
x
x
被分配给一个立即返回另一个函数的函数。 a
“隐藏”a
在返回的lambda函数的闭包中。在不调用x
的情况下以任何方式访问a
不可能,但double result = Double.Parse("6.75436E+12", System.Globalization.NumberStyles.Float);
仍然存在于内存中,因为它可以在外部范围内访问,因此范围,返回的lambda。
答案 1 :(得分:0)
您的函数aClosure
只是通过全局范围访问您的a
变量,因此,它不是一个闭包,您可以看到它实际上修改了此a.b
值例如:
let a = { b: 42 };
let aClosure = () => { a.b++ };
console.log(a.b); //42
aClosure();
console.log(a.b); //43
如果您想更好地理解闭包,我建议this book。