84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
两个问题:1.维基百科里写:闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。这句什么意思,能否举个例子?
2.闭包的形成很简单,在执行过程完毕后,返回函数,或者将函数得以保留下来,即形成闭包,函数得以保留下来是什么意思?
业精于勤,荒于嬉;行成于思,毁于随。
下面说明的是JS中的闭包。
简单的范例,这是回传巢状(内部)函数:
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函数调用时:
b函数调用时:
像上面的例子中,变量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中的闭包产生与使用是有一些基本规则,你可以多找找网上文章。
刚解决的问题,你把这个看看吧。实例和详解都有了
下面说明的是JS中的闭包。
1. 不同闭包实例代表用同个函数建立闭包时,因为记忆环境变量的不同,所以会产生不同的闭包实例。
简单的范例,这是回传巢状(内部)函数:
用Chrome除错器看看闭包(Closure)里面有什么,很明显的两个闭包中的包含内容不同(记忆的环境变量不同),是不同的实例。下面为图解:
a函数调用时:
b函数调用时:
2. 函数得以保留下来,是指像巢状(内部)函数会保留下来
像上面的例子中,变量a实际上会是原本函数test中的回传出来内部函数。所以变量a可以进行函数呼叫(调用),而且会记住当时在建立函数的所有记忆到的相关变量x, y等等。
IIFE结构也可以形成闭包的实践,如下面的例子:
维基说的会比较模糊,但在JS中的闭包产生与使用是有一些基本规则,你可以多找找网上文章。
刚解决的问题,你把这个看看吧。实例和详解都有了