js中for循环变量的作用域
来源:互联网 发布:网络棋牌推广违法吗 编辑:程序博客网 时间:2024/05/22 10:45
js中for循环变量的作用域
今天在网上看到一个前端的面试题就想做做,题目如下:
<!doctype html><html lang="en"><head> <meta charset="UTF-8" /> <title>MR_LP --> QQ :3206064928</title></head><body></body><script type="text/javascript" charset="utf-8"> var data = []; for(var k = 0; k < 3; k++){ data[k] = function(){ console.log(k); }; } data[0](); data[1](); data[2]();</script></html>猜猜这段代码输出结果是什么?
在没有实践前原来心里以为就是0,1,2咯,不过暗想没有那么简单,就把这个代码敲了下,结果控制台输出如下:
想了半天都没有理解为什么,在查找资料之后才知道,由于for循环不是不是在一个方法体中,所以for循环中的k是a同级的变量,即全局变量,最终循环结束,k保存在内存中不会马上销毁,所以你在for循环结束的时候输入k可以看到k=3;
而 data[k] = function(){
console.log(k);
};在for循环中相当于闭包,data[0]、data[1]、data[2] 函数内的变量k实际都是指向同一个地址,所以输出的值都是一样的。
不过值得注意的是,如果在for循环中声明变量为let的话,则输出的值则为 0、1、2,因为let是严格模式,声明的变量只在let命令所在的代码块有效果,也就是只有在for循环中有效,所以如果你把代码改成:
<!doctype html><html lang="en"><head> <meta charset="UTF-8" /> <title>MR_LP --> QQ :3206064928</title></head><body></body><script type="text/javascript" charset="utf-8"> var data = []; for(let k = 0; k < 3; k++){ data[k] = function(){ console.log(k); }; } console.log("k="+k); data[0](); data[1](); data[2]();</script></html>
运行的时候控制台就会报错如下:
1 0
- JS中for循环变量作用域
- JS中for循环变量作用域
- js中for循环变量的作用域
- 注意for循环中变量的作用域
- 注意for循环中变量的作用域
- 注意for循环中变量的作用域
- for循环变量作用域的范围
- vc6中for语句定义的变量的作用域超出for循环的解决办法
- vc6中for语句定义的变量的作用域超出for循环的解决办法
- ES6 中 let的在for循环中变量作用域问题的探讨
- 讲解Python中for循环下的索引变量的作用域
- 读取文件行时变量的作用域 for循环和while循环的作用域
- js中for循环的作用域;函数调用的理解;数组对象的理解;
- for循环中的变量作用域
- 关于JS中for循环时,作用域问题和this指针指向的总结
- js中变量的作用域
- js中变量的作用域
- js中变量的作用域
- 【BZOJ】 1001 [BeiJing2006]狼抓兔子 网络最大流
- springmvc注解区分一个有多个实现类的借口
- Vue.js学习系列(二十)--常用指令(三)
- 篱栅:CyclicBarrier
- 《ACM程序设计》书中题目R-18
- js中for循环变量的作用域
- MongoDB -- MongoClient连接池用法
- dubbo配置文件报错解决思路
- uboot下ARMv8 lds
- thinkphp模板if语句判断根据字符长度判断是否截取
- 纯css实现进度条效果
- Java 理论与实践: 正确使用 Volatile 变量
- 利用Hive进行数据分析
- Docker 1.12 Swarm集群实战(第五章)