JS关于for循环中变量作用域的问题
2018-09-20 15:30
507 查看
js中作用域只有函数作用域和全局作用域,在函数体内使用var 定义的变量,会被提到函数开始处进行定义,作用域为整个函数,常见的误区如下
[code] 1 var a=[]; 2 for(var i = 0;i<10;i++){ 3 var q = i; 4 a[i]=function(){console.log(q)} 5 } 6 a[0]() 7 8 其中,由于for循环并不是一个函数体,所以for循环中定义的变量q和i是作用域for循环所在的函数体,和a同级, 9 i++ 和 q=i 并不是重新定义变量,只是重复赋值,最终循环结束,i = 10,q=9; 10 由于function(){console.log(q)} 并不是立即执行,所以这里的q一直是存储的内存引用,最终所有的a[i]()都是输出 9 11 不过,在es6中新增了let命令声明变量,用法和var类似,不过let所声明的变量,只在let命令所在的代码块有效果,for循环的计数器中就很适合let命令 12 var a=[]; 13 for(let i = 0;i<10;i++){ 14 ley q = i; 15 a[i]=function(){console.log(q)} 16 } 17 a[6]() //这里会输出 6 let声明的变量仅在块级作用域有效,所以这里的i只在本轮循环有效果,每次循环的i其实都是一个新的变量
有两种方法可以将其变成块级作用域,一种是使用闭包,第二种就是使用ES6中的let定义变量。
阅读更多相关文章推荐
- 关于js中的所谓的for循环典型问题的剖析,通过现象看本质
- 关于for循环中,定义的i的作用域的问题。
- JS中for循环变量作用域
- 解决VC6和VC2008的for循环变量作用域不同问题的一个方法
- js中for循环变量的作用域
- for循环中声明变量的一个问题回顾
- 关于String字符串的""值问题以及for增强循环
- 关于for语句结束循环时变量的值
- 一个问题,关于函数嵌套后的变量作用域
- 关于php中foreach循环地址符及变量应注意的问题
- 关于JS管理作用域的问题
- 关于Java for循环括号中的变量的Java测试
- 关于for 循环里 线程执行顺序问题
- 关于javaBean中boolean类型变量的set和get注入后传到前端JS中的问题
- 关于JS管理作用域的问题
- 关于JS管理作用域的问题
- “SET 命令设置的环境变量在 FOR 循环中始终为空”问题的原因与解决方法
- 关于arcpy中的Cursor,for循环问题
- for循环中 4000 的变量作用域
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。