为什么这不是封闭

时间:2017-08-08 18:51:25

标签: javascript

因为闭包是一个与它的词汇环境绑定的函数,我想知道为什么notAClosure构造不是一个闭包:

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

notAClosure被调用时,我们通过引用传递给它a对象。这意味着现在在闭包内我们可以访问外部scope = lexical环境。 我的功能是否正确? aClosure是真正的封闭吗? notAClosure真的不是一个闭包,如果是正确的 - 为什么呢?

2 个答案:

答案 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