JS闭包-02
来源:互联网 发布:东欧社会主义国家 知乎 编辑:程序博客网 时间:2024/06/06 00:47
闭包的应用:
1.保存(变量)现场 ------------------------------------------------ var date = []; for(var i=0;i<5;i++){ date[i] = function(){ console.log("我的索引位置是: " + i); } } date[0](); // 我的索引位置是: 5 date[1](); // 我的索引位置是: 5 date[2](); // 我的索引位置是: 5 -------------------------------------- 函数执行过程 : -------------------------------------- 1.初始化全局环境global environment 1.outer reference = null 2.初始化环境记录 date:undefined i:undefined 2.执行全局代码 date = [] i = 0 -----> i = 5 通过for循环创建5个匿名函数分别赋值给date数组中的元素,且其scope属性都是global environment 3.执行到date[0](); 初始化date[0]环境 1.outer reference = global environment 2.初始化环境记录 无 4.执行date[0](); 解析i值,即global environment中的i i已经是5 5.下面同理 i的值都是5 ****************************************************************** 因为匿名函数的外部环境都是global environment,所以只可以在global environment中解析i,而 global environment中的i只能有一个最终值,不可能解析出不同的值, 如果想把for循环中不同的i值都保存下来需要再添加一层环境来保存i的不同的值 ****************************************************************** 改进版: -------------------------------------------------- var date = []; function helper(index){ return function(){ console.log("我的索引位置是: " + index); } } for(var i=0;i<5;i++){ date[i] = helper(i); } date[0](); // 我的索引位置是: 0 date[1](); // 我的索引位置是: 1 date[2](); // 我的索引位置是: 2 ------------------------------------------------- 代码执行过程 : ------------------------------------------------- 1.初始化全局环境 date:undefined i:undefined 2.执行全局代码 3.执行到date[0] = helper(0);时 4.初始化helper(词法)环境 1.outer reference = global environment 2.初始化环境记录 index: 0 (这一点很重要,这里i的0这个值通过index = 0被保存在helper词法环境中) 5.执行helper(0); date[0] = function(){console.log("我的索引位置是:" + index)} .... .... .... x.执行到date[0]();初始化date[0]环境 1. outer reference = helper environment 2. 初始化环境记录 无 y.执行date[0]() 解析index,即其外部环境helper environment中的index = 0 **************************************************** for循环中的每一次循环都会创建不同的helper环境,其中保存着不同的index值(可以理解为i的副本) 实际上,date[i]获得的匿名函数是一个闭包,其中引用着其外部环境helper环境中的index ****************************************************
0 0
- JS闭包-02
- js代码优化02(闭包)
- js闭包示例
- JS 闭包 计数器
- js闭包
- js 闭包
- js闭包
- js闭包
- js闭包
- js 闭包
- js 闭包
- js闭包
- js闭包
- (function (){})(); JS 闭包
- JS 闭包应用
- js闭包
- JS闭包
- JS 闭包随笔
- DES算法描述
- 二叉树10:最大二叉搜索子树
- access注入及工具使用
- 【python】解决urllib2乱码问题
- K
- JS闭包-02
- 在PhpStorm中使用git将项目上传到码云
- hihocoder 1121 : 二分图一•二分图判定
- Android adb 常用命令
- IE9对CSS3属性的支持情况
- Mac版tomcat下载安装启动
- android中编译linux内核
- 二叉树11:二叉树的深度
- UVA 839 二叉树的递归输入并求和