vararr=[];for(**var**i=0;i
2 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
这种问题请去baidu作用域与闭包var变量提升,第一个里循环结束i=10,所以会打印10个10第二个是典型的闭包,每一个闭包引用内部的i变量,所以是0-9
LEATH
TA贡献1936条经验 获得超6个赞
var存在变量提升,所以你写的for(vari=0;i<10;i++){arr[i]=function(){returni;};}等同于varifor(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(){debuggerconsole.log(i);};}for(varj=0;jconsole.log(arr[j]()); }//0-9ps:个人理解,如有错误,希望指出
添加回答
举报
0/150
提交
取消