84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
两个问题: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中的闭包产生与使用是有一些基本规则,你可以多找找网上文章。
刚解决的问题,你把这个看看吧。实例和详解都有了