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

var和let的区别,为什么这两个函数执行的结果不一样呢

var和let的区别,为什么这两个函数执行的结果不一样呢

吃鸡游戏 2019-05-23 17:43:30
vararr=[];for(**var**i=0;i
查看完整描述

2 回答

?
慕雪6442864

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

这种问题请去baidu作用域与闭包var变量提升,第一个里循环结束i=10,所以会打印10个10第二个是典型的闭包,每一个闭包引用内部的i变量,所以是0-9
                            
查看完整回答
反对 回复 2019-05-23
?
LEATH

TA贡献1936条经验 获得超6个赞

var存在变量提升,所以你写的
for(vari=0;i<10;i++){
arr[i]=function(){
returni;
};
}
等同于
vari
for(i=0;i<10;i++){
arr[i]=function(){
returni;
};
}
实际上就是定义了一个全局变量。
虽然你return的是i,但是你在调用arr[i]这个函数的时候,会沿着作用域链找到arr[i]这个函数的上一层作用域,在这里即是全局作用域。所以你调用的时候var已经是10了,可以在for循环后面添加一个console.log(i)验证。
let会创建一个作用域。则,这里就会形成一个闭包所以,使用let定义时,则分成了三层Global-->Closure-->Local作用域所以你在调用arr[i]这个函数时,其实会根据作用域链找到Closure(闭包)中的变量i。使用下面这行代码,打开浏览器中的Source面板并查看右侧的Scope(作用域链)验证。
vararr=[]
for(leti=0;i<10;i++){
arr[i]=function(){
debugger
console.log(i);
};
}
for(varj=0;jconsole.log(arr[j]());
}//0-9
ps:个人理解,如有错误,希望指出
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 505 浏览
慕课专栏
更多

添加回答

举报

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