Javascript闭包
2015-10-10 09:18
471 查看
基础知识
变量作用域:function f() { var localVariable = 100; function innerFunction() { localVariable += 1; alert(localVariable); } return innerFunction; } var temp = f(); temp();
Demo
1. javascript解析器会在页面加载后创建一个全局执行上下文(Execution Context),全局执行上下文的作用域链中只有一个全局对象,它定义了javascript中所有可用的全局变量和函数,全局对象在初始化的时候会包含this,window,document等对象,全局对象会随着javascript的执行动态地新增对象。
2. 当javascript解析器执行到函数声明function f(){...}的时候,因为函数f是一个全局函数,所以会把全局执行上下文的作用域链赋给函数f的内部属性scope(内部属性无法通过javascript直接访问)。
3. 接下来var temp = f(),这时javascript解析器会执行函数f,同时创建一个对应的执行上下文,并创建一个活动对象,并初始化给this和函数传入参数arguments,同时加入函数f中所有的变量(初始化为undifined),随着函数的执行变量将逐步被赋值。活动对象会出现在执行上下文作用域链的顶端,紧接着是f函数的scope属性中的对象。
![](http://images2015.cnblogs.com/blog/466668/201510/466668-20151010091449581-182519838.png)
4. 执行f函数的时候,javascript解析器会完成函数innerFunction的声明,这时innerFunction的执行上下文是函数f的执行上下文,所以会把函数f的执行上下文作用域链赋值给innerFunction的scope属性。
5. 最后执行temp(),其实就是执行innerFunction(),这时候会创建一个对应的新的执行上下文,同时创建temp函数的活动对象。同样活动对象会出现在作用域链的顶端,接下来是scope属性的作用域链。
![](http://images2015.cnblogs.com/blog/466668/201510/466668-20151010091526456-1598651570.png)
此时,函数f从声明到执行的步骤就完成了。最终函数temp的作用域链引用着函数f的活动对象,所以在函数f返回后就不会被GC回收。从这里也可以清晰地看到,函数temp在查找localVariable变量的时候,首先先从自身的活动对象中查找,找不到再到原型对象(有关原型对象这里就暂时不讨论了)中找,之后就到函数f的活动对象中找,再找不到就到全局对象中查找。
文章来源:teroy的博客
相关文章推荐
- clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
- js函数语句和表达式定义函数记录
- POST 上传 JSON 数据
- 页面内容排序插件jSort使用方法
- Jsoup学习之Jsoup类
- Jsoup学习之Whitelist类
- Jsoup学习之Document类
- JS动态改变select选择变更option的index值
- JS数组定义
- C#操作 JSON方法汇总
- js观察者模式
- 公历和农历转换的JS代码
- 使用 jsoup 对 HTML 文档进行解析和操作
- C# 技巧(3) C# 操作 JSON
- 使用json-lib封装json
- JavaScript实现Ajax小结
- JSP九大内置对象
- js中(function(){…})()立即执行函数写法理解(转载oschina)
- js模块化历程
- js继承原理