为什么以下JavaScript函数不是闭包?

时间:2016-12-11 12:49:29

标签: javascript closures

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返回的是而不是一个闭包吗?
  • 是因为闭包不会在返回的范围内记录变量的值吗?
  • 是因为另一个原因吗?

2 个答案:

答案 0 :(得分:2)

  

是因为f0返回的内容不是封闭吗?

没有。每个函数都是JavaScript中的闭包。

  

是因为闭包不会在返回的范围内记录变量的值吗?

是。闭包不记录,拍摄当前状态的快照。它只是记录对范围的引用。它是定义的范围,而不是它返回的范围。

答案 1 :(得分:0)

我将在开始时稍微离题,以明确闭包的概念。 在像c ++这样的语言中,函数返回局部变量被认为是个坏主意,除非它们是在堆上分配的。

示例:

 x foo() {
   x obj;
   return obj;
 }

 cout<< foo() << endl;

在上面的例子中,一旦我们从foo返回,obj就会被销毁,因此,我们最终得到垃圾作为输出。

在Javascript中,由于闭包的概念,这是合法的。

  

闭包是一种特殊的对象,它结合了两件事:   功能,以及创建该功能的环境。该   环境由任何在范围内的局部变量组成   关闭创建的时间。

因此,在您的情况下,一个变量(y)将来自封闭函数的环境,但x是一个全局变量,可以从外部函数更改。

内部封闭变量(例如y)也称为私有变量,因为在你的情况下,获取它们的唯一方法是通过myFunc()。