使用let声明的变量,会产生闭包吗?


    var b = 0;
    if(true) {
      let a = 0;
      function f() {
        console.log(a);
        return a;
      }
      b = f();
    }
    console.log(b);

会产生闭包吗!

有时候要看浏览器,遇到过这样的坑,排查了很久

可以的
用let和const定义的变量才会存在块级作用域。这个块级作用域和局部作用域(函数作用域)是没有太大区别的,不同之处在于,块级作用域仅仅约束let和const定义的变量的作用范围,而局部作用域没有这个限制,可以约束所有该作用域定义的变量。
在这个示例中变量a作为块级作用域的变量,在f函数的作用域(局部作用域)中被引用了,是符合闭包出现的条件的。

首先你要对各种声明方式有清晰的认知并知道其间的差异
var 声明的变量挂载再window上,浏览器解析js时 在执行js代码之前会把所有var声明的变量挂载在window上并赋值为undefined,执行到复制语句才会赋值。这种机制也被称为变量提升
let 和 const 是因为之前js把所有变量挂载在window上,显得太过臃肿,数据量太过庞大可能会影响性能。故在js版本升级时就出现了新的产物。
let 可以更改值 const不可以(仅限简单数据类型)
结论:以上我们可以看出它们的区别只是在声明变量的时候有所差异 最终都是数据的载体,所以是否会影响变量回收机制(就是你说的闭包)并没有直接的关系。