var x = 5;
function f0() {
return function () {
var y = 10;
var z = x + y;
console.log('x + y is: ' + z);
}
}
var myFunc = f0();
myFunc();
x = 10;
myFunc();
在上面的示例中,我还希望第二次打印x + y is: 15
。因为据我所知,从f0
返回的是一个闭包。我认为闭包在定义时会在其环境中获取变量的快照。因此,我认为用x
更改x = 10;
不会影响闭包中使用的自由变量。
但显然我错了。您能否告诉我为什么更改x
会更改从f0
返回的函数的结果?
f0
返回的是而不是一个闭包吗?答案 0 :(得分:2)
是因为
f0
返回的内容不是封闭吗?
没有。每个函数都是JavaScript中的闭包。
是因为闭包不会在返回的范围内记录变量的值吗?
是。闭包不记录值,拍摄当前状态的快照。它只是记录对范围的引用。它是定义的范围,而不是它返回的范围。
答案 1 :(得分:0)
我将在开始时稍微离题,以明确闭包的概念。 在像c ++这样的语言中,函数返回局部变量被认为是个坏主意,除非它们是在堆上分配的。
示例:
x foo() {
x obj;
return obj;
}
cout<< foo() << endl;
在上面的例子中,一旦我们从foo返回,obj就会被销毁,因此,我们最终得到垃圾作为输出。
在Javascript中,由于闭包的概念,这是合法的。
闭包是一种特殊的对象,它结合了两件事: 功能,以及创建该功能的环境。该 环境由任何在范围内的局部变量组成 关闭创建的时间。
因此,在您的情况下,一个变量(y)将来自封闭函数的环境,但x是一个全局变量,可以从外部函数更改。
内部封闭变量(例如y)也称为私有变量,因为在你的情况下,获取它们的唯一方法是通过myFunc()。