为什么上面这段代码没有直接写的 function add (){...} 而是把function赋值给了变量add呢?
2017-12-15 09:14
246 查看
var add = (function () { var counter = 0; return function () {return counter += 1;} })();
我们通常会想当然的认为每次调用 add() 都会重走一遍add()中的代码块, 但其实不然。
注意add方法中的return, 它return的并不是1,2,3这样的数值,而是return了一个方法,并且把这个方法赋值给了add变量。
那么在这个function自运行一遍之后,其实最后赋值给add的是return counter += 1 这段代码。
所以后面每次调用add() 其实都是在调用return counter += 1。
再结合文章之前所说的, 闭包会持有父方法的局部变量并且不会随父方法销毁而销毁, 所以这个counter其实就是来自于第一次function执行时创建的变量。
闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会增加内存消耗。
或者说闭包就是子函数可以使用父函数的局部变量,还有父函数的参数。
相关文章推荐
- windows7开机为什么不直接进入桌面,而是到登陆界面点下用户,注没有加密码
- Ajax 得到的值对全局变量赋值没有起作用解决办法和 Jquery append()进去的动态代码 点击的js没起作用
- 再点击showmessage的ok按钮为什么没有返回登入窗口而是直接进入了主窗口?????
- 在aspx页面中直接绑定代码文件中的变量
- 高级语言为什么不直接编译成机器码,而编译成汇编代码?
- String为什么推荐使用直接赋值的方式?
- scanf为什么要取地址,而不直接使用变量名
- C语言中,为什么字符串可以赋值给字符指针变量
- JavaScript基础 定义一个变量,但没有赋值,输出为undefined
- KETTLE“设置变量“、”变量赋值”"和“自己定义JAVA代码”的实例应用(kettle动态excel文件名需要重点参考看1.1.4)
- C/C++中,为什么字符串可以赋值给字符指针变量,单引号和双引号的区别
- 请教在block中如何给实例变量赋值?为什么block结束后实例变量又变为nil了呢
- java堆空间子父类顺序(1)开辟空间都为0(2)父类初始化不管值(3)把成员变量赋值的显示初始化(4)构造代码块(5)子函数初始化
- 当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。
- 记录一次操作git 的愚蠢行为(本地代码只 git add 过,没有 commit ,push 过,然后版本回退 导致本地代码丢失)
- PHP代码为什么不能直接保存HTML文件——>PHP生成静态页面教程
- 很漂亮的按钮css样式(没有用到图片,可直接拷贝代码使用)
- 为什么 我 的myeclipse调试的时候,有时鼠标放在变量上就显示变量值,有时就没有,提示不可以显
- 【求助】Html弄的比较少,问一个弱弱的问题,为什么下面代码在IE中tr之间有空白行,而在Firefox中没有空白
- C语言代码,求高手解答,为什么没有错误,但是结果不对