您的位置:首页 > Web前端 > JavaScript

js闭包题型举例

2016-12-28 21:10 218 查看
输出:0 1 0

解析:考察点为闭包,

什么是闭包?

当函数内部匿名函数用到函数的变量,并且匿名函数有返回值,这就形成了一个闭包。在一个函数的内部定义另一个函数,通过另一个函数来访问这个函数的局部变量,这是创建闭包的最常见的方式。而闭包会常驻内存(增大内存的使用量)。

foo函数两次分别将返回值也就是匿名函数赋值给f1 f2 ,即在堆中开辟了两个匿名函数的空间,f1 f2分别指向一个。因此两者作用域互不影响。
foo 里的匿名函数形成一个闭包,匿名函数作用域连同返回值一起进行了赋值,也就是开辟了两个var i =0空间。第一次调用,指向堆中的对应空间,输出0,因为是i++,i++,先输出再自家,此时i等于1,覆盖了作用域里的i,第二次调用输出1。当调用f2,他指向新的空间,空间中i 等于0,因戏输出0

闭包,在内部定义的变量不会被回收,所以第二次调用f1()函数时,i++之后的变量可以在第二次接着使用,所有第二次调用f1()结果为1;

这里需要理解闭包与传参,内部函数会调用父级的参数两次调用f1,此时f1的值已经是return的函数了,参见闭包,第一次搜寻父级找到零,i是被修改,放在栈中,下次再次调用也是直接运行return的值,而不会运行var

(1)Function是引用类型:保存在堆中,变量f1,f2是保存在栈中;

(2)闭包:一个函数(产生新的作用域)定义的局部变量、子函数的作用域在函数内,

         但是一旦离开了这个函数,局部变量就无法访问,所有通过返回子函数到一个变量f1的方法,让

         f1指向堆中的函数作用域,这样可以使用局部变量i.

(3)   过程:

   第一次f1()  :f1=Foo()中,先执行Foo(): i = 0,return值返回给f1

 (f1指向子函数   f1()=function(){.....},因为子函数没有 定义i,所以向上找到父函数定义的 i:  )并执行子函数 输出i=0,再自加 i =1(覆盖了父函数Foo 的 i值);

  第二次f1() : 执行的是子函数 Function(){  ..},输出的是父函数 的 i=1,再自加 i =2;

  第一次f2():同第一次f1(),不同的是 f2指向堆中一个新的对象 function(){ ...},所有此i非彼i,输出i=0;如果再次f2(),那么和第二次f1(),一样输出i=1; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: