为了账号安全,请及时绑定邮箱和手机立即绑定

javascript let和var的用法

javascript let和var的用法

素胚勾勒不出你 2018-08-10 09:06:58
在看阮老师的ECMAScript 6 入门 时遇到了这个问题。先贴代码 :var a = [];for (var i = 0; i < 10; i++) {   a[i] = function () {    console.log(i);   }; } a[6](); // 10不理解为什么是10,书中是这样解释的。变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。先假设是覆盖了,那为什么是10,为什么不是9, 不是 i < 10 吗?还有这个let的用法var a = [];for (let i = 0; i < 10; i++) {   a[i] = function () {    console.log(i);   }; } a[6](); // 6let声明 i , 就得到了6,这是为什么啊?书中是这样解释的。变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。整理下问题 :1.用var声明的为什么结果是10,就算不是6,也该是9啊,因为循环是从0-9.2.用let声明的为什么是6?
查看完整描述

1 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

1 这个问题跟var let没关系,10是因为循环到9以后,js并不知道循环结束了,还会进行下一次循环,i加一等于10,然后判断条件发现不满足,才跳出循环。
2 var i你想象成全局变量,每次循环修改的、函数里面console.log访问的,都是同一个i。a[6]()是在循环结束后执行的,这时候的i由第一问知道是10。
let i你想象成局部变量,每次循环都生成一个新的,函数里面console.log访问的也都是不同的i。下面这段代码可能对你有点绕,但理解后对你学习js的变量很有帮助:

for (var i=0;i<10;i++) {
  a[i]=(function(i){    return function() {      console.log(i);
    })(i);
}
a[6](); // 6

循环变量i传到一个立即执行函数里,变成了局部变量i(其实这个函数的参数可以任意取名,取成i为了加深你的理解),在这个局部变量的作用域内定义了一个函数引用了它,js就会把它作为函数的上下文保存起来,所以console.log得到的是0到9不同的值。


查看完整回答
反对 回复 2018-09-23
  • 1 回答
  • 0 关注
  • 1059 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信