闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

两个问题:
1.维基百科里写:闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。这句什么意思,能否举个例子?

2.闭包的形成很简单,在执行过程完毕后,返回函数,或者将函数得以保留下来,即形成闭包,函数得以保留下来是什么意思?

阅读 2.6k
2 个回答

下面说明的是JS中的闭包。

1. 不同闭包实例代表用同个函数建立闭包时,因为记忆环境变量的不同,所以会产生不同的闭包实例。

简单的范例,这是回传巢状(内部)函数:

function test(x){
       var y = 10;
 
     return function(){
          var z = x + y;
           console.log(x, y, z);
    }
}

var a = test(1);
var b = test(2);

a(); // 1 10 11
b(); // 1 10 12

用Chrome除错器看看闭包(Closure)里面有什么,很明显的两个闭包中的包含内容不同(记忆的环境变量不同),是不同的实例。下面为图解:

a函数调用时:

a函数调用时

b函数调用时:

b函数调用时

2. 函数得以保留下来,是指像巢状(内部)函数会保留下来

像上面的例子中,变量a实际上会是原本函数test中的回传出来内部函数。所以变量a可以进行函数呼叫(调用),而且会记住当时在建立函数的所有记忆到的相关变量x, y等等。

IIFE结构也可以形成闭包的实践,如下面的例子:

var a;

(function(x){
  var y = 10;
  a = function(){
    z = x + y;
    console.log(x, y, z)
  }
})(1);

a();

在JS中的闭包结构理论上是函数自然就有的特性。并不是只有上面几个例子这样才叫闭包,而是这些例子能充份运用闭包的特性,是闭包的实践。

维基说的会比较模糊,但在JS中的闭包产生与使用是有一些基本规则,你可以多找找网上文章。

推荐问题
宣传栏