We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。
既想反复使用,又想避免全局污染
1.定义外层函数,封装被保护的局部变量。 2.定义内层函数,执行对外部函数变量的操作。 3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。
直接上图,点击图片方法查看。要记住函数对象、作用域链对象、执行环境(EC)和活动对象(AO)这几个东西都啥时候出现,啥时候消失。
看下面这个函数,函数对象的地址仅作标识,不代表真实的地址。
var getNum;//------------------------1 function getCounter() { // ----------2 var n = 1; var inner = function () { return n++; } return inner; } getNum = getCounter();//------------3 console.log(getNum()); //1 ---------4 console.log(getNum()); //2 ---------5
程序运行到2的时候:
程序运行到3的时候:
运行到4的时候,外层函数调用结束,AO对象释放,图中红线断了:
4处的代码执行时:
4处的代码执行完:
总结:可以看到内层函数对象被全局的变量getNum引用,所以内层函数相关的AO对象,作用域链对象在函数调用完都无法被内存回收,因此占用了更多的内存空间,但是这样持久的保存了需要的n。
n
The text was updated successfully, but these errors were encountered:
No branches or pull requests
基础概念
什么是闭包
简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。
为什么需要闭包呢
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。
特点
何时使用
既想反复使用,又想避免全局污染
如何使用
1.定义外层函数,封装被保护的局部变量。
2.定义内层函数,执行对外部函数变量的操作。
3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。
函数生命周期
直接上图,点击图片方法查看。要记住函数对象、作用域链对象、执行环境(EC)和活动对象(AO)这几个东西都啥时候出现,啥时候消失。
例子实战
看下面这个函数,函数对象的地址仅作标识,不代表真实的地址。
程序运行到2的时候:
程序运行到3的时候:
运行到4的时候,外层函数调用结束,AO对象释放,图中红线断了:
4处的代码执行时:
4处的代码执行完:
总结:可以看到内层函数对象被全局的变量getNum引用,所以内层函数相关的AO对象,作用域链对象在函数调用完都无法被内存回收,因此占用了更多的内存空间,但是这样持久的保存了需要的
n
。The text was updated successfully, but these errors were encountered: