闭包

    xiaoxiao2021-03-25  83

    1 2 3 4 5 6 7 8 9 10 11 function Foo(){       var i= 0 ;       return function(){           document.write(i++);       } } var f1=Foo(), f2=Foo(); f1(); f1(); f2();

    请问以上程序的输出是()

    正确答案: A

    010 012 000 011

    这是一个闭包,闭包可以用在许多地方。

    它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 

    这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加油,但是相互之间不影响,因此结果是010

    1.当函数被创建时,内部[scope]属性被存储,在这个属性中保存一个包含全局变量对象的作用域链。 2.当函数被调用时,会创建一个执行环境及相应的作用域链,argument和实参为其进行初始化。 这里f1()函数和f2()函数在调用时会创建两个执行环境,保存各自的变量对象,结果是没有关系的。而同一个函数在多次调用时返回值会被保存在同一个变量对象中。 简言之,f1(),f2()分别创建了自己的执行环境,所以它们两个是相互独立的,执行之后都会返回一个匿名函数,这个匿名函数的作用域链被初始化为其包含函数的活动对象(这里也就是i)和全局变量对象,f1执行之后i并不会销毁,因为返回的匿名函数还要引用i,i仍然在内存中,所以执行两次之后i的值变成了1,而f2执行之后i为0

    转载请注明原文地址: https://ju.6miu.com/read-18545.html

    最新回复(0)