javascript - 这个js函数的输出的结果不一样的原因是什么呢?

查看:123
本文介绍了javascript - 这个js函数的输出的结果不一样的原因是什么呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

如图为什么结果会不一样呢

解决方案

每次进入一个函数,都会将里面的语句全部执行一次,第一次调用f1()()会定义一个函数级别变量n,并且将隐性全局变量的值设为一个函数,注意这个函数因为是在f1中定义的,所以它可以引用它创建时的所有变量,这也就是闭包的由来,对于没有闭包的情况,函数内的函数级别变量(函数内用var声明的)都会在函数结束后销毁,但是一旦存在闭包,也就是逃逸出这个函数级作用域的函数(不管你是通过返回函数,或者设置为全局变量),这个逃逸的函数,都可以访问它创建时的所有可见变量,阻止浏览器回收这些变量。
每次调用f1是都会定义一个函数体完全一样但是却是不同函数的函数对象,所以第一次调用f1()后,已经形成了闭包:返回的f2盒全局的nadd,调用f1()()的结果就是调用了返回的f2,这时第一次调用f1时创建的n1(这个1代表它是第一次创建的,仅仅为了表述清楚,实际上它是n),就是999,然后调用nadd()n1被加一,所以输出了1000,但是你再次调用f1(),这时有趣的事情发生了,f1的函数体要再执行一次,看似好像nadd没有改变,但是其实它已经指向了一个新的函数,尽管这个函数的函数体和它之前的函数体是完全一样的,但是它们是不同的对象,最大的不同就在于可以访问的变量不同,第二次的nadd,可以访问的已经不再是n1,而是第二次调用f1()创建的n2了,这个n2的值为999,至于n1呢?它因为已经没有函数可以访问,被回收啦!因为返回的f2并未被存为变量而且第一次f1中定义的nadd也已经不在了。
后面的为什么是那个结果题主可以自己想一下,闭包是js中的一个双刃剑,威力无穷也很蛋疼,但是只要好好思考是很好理解的,一旦理解,合理的使用闭包会带来很多好处,但是也有很多坑需要注意,具体的题主可以google下!

这篇关于javascript - 这个js函数的输出的结果不一样的原因是什么呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆