JavaScript的闭包

2021年4月19日 26点热度 0人点赞 0条评论

作用域可分为:

  1. 全局作用域,全局变量挂载在window对象下,在任何位置都可以使用或者访问到该变量;但它也有个缺点,就是在我们定义很多变量的时候,很容易引起变量命名冲突;
  2. 函数作用域,在函数中定义变量,只能在函数内部才能访问到这些变量,所以该变量的作用域也只能是该函数内部;
  3. 块级作用域,是ES6新增的一个作用域,它有一个很明显的特征就是let关键词。通过let定义的变量只能在块级作用域内使用和被访问。

闭包

有权限访问另一个函数作用中的变量的函数,换一句话说,闭包就是让内层函数访问到它外层函数的作用域。

闭包常见的形式:

  1. 返回一个函数;
  2. 在定时器、事件监听、Ajax请求和Web Workers或者是异步中使用回调函数;
  3. 作为函数参数传递的形式;
  4. IIFE(立即执行函数),创建了闭包,保存全局作用域和当前的函数的作用域,可以输出全局的变量。
for (var index = 1; index <= 5; index++) {
  setTimeout(function(){
      console.log(index); // 6
  },0)
}

以上代码为什么打印的5个6,而不是1,2,3,4,5。

因为setTimeout函数是一个闭包,一开始代码解释器在最底层的作用域内查找index,没有找到,就会网上一层作用域查找。但是再往上的作用域就是window了,而变量index是window上的全局变量,所在在开始执行setTimeout函数的时候,index就是6了,所在在循环体内会一直打印的是6。

那么想要打印出我们想要的结果,代码修改如下:

for (var index = 1; index <= 5; index++) {
  (function(key){
    setTimeout(function(){
        console.log(key)
    },0)
  })(index)
}

读心悦

读心,读自己!

文章评论