首页 > 其他 > 详细

let块级作用域

时间:2020-08-26 23:54:06      阅读:117      评论:0      收藏:0      [点我收藏+]

一直只是明白,let是块级作用域,但是这个概念很模糊,

下面有个循环的题目我们来看是如何用块级作用域来解决的

for (var i = 0; i < 3; i++) { 
  setTimeout(function() {  
    console.log(i);       
  }, 0);
}

当我们执行的时候我们得到的答案是3,3,3

我们改为let定义变量的时候

for (let i = 0; i < 3; i++) { 
  setTimeout(function() {  
    console.log(i);       
  }, 0);
}

执行结果毫无疑问大家应该都是知道的,1,2,3

但是大家都说是块级作用域,那么块级作用域是有什么作用呢?

当我们用var和let定义的时候,我们打印一下
for (var i = 0; i < 3; i++) { 
console.log(i);//1,2,3
  setTimeout(function() {  
    console.log(i);       
  }, 0);
for (let i = 0; i < 3; i++) { 
console.log(i);//1,2,3
  setTimeout(function() {  
    console.log(i);       
  }, 0);
打印的结果都是123,为什么执行下一步就会变换成不同的结果呢?
这是我查询一篇文章所听到最好的解答:JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域

1.定时器为异步执行,for循环的执行速度很快,当真正执行到函数体时,此时i早已变成3,所以结果不想而知。

循环展开如下(var具备变量提升,且不支持块级作用域,所以如下代码只有一个全局变量i)

2.let支持块级作用域,var不支持(var只有函数作用域和全局作用域),所以let声明的变量只在它所在的代码块有效。

循环展开如下(let没有变量提升,且支持块级作用域,所以如下代码每个块内都有一个独立的i)

 

let块级作用域

原文:https://www.cnblogs.com/laoli-boke/p/13568706.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!