经典闭包

94 阅读1分钟

一、let-var在for循环中执行原理

1、var

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

执行结果 4,4,4

分析:每执行一次循环将setTimeout交给定时器模块处理,1秒后将任务放进异步队列里,闭包也会把当前的执行上下文环境给保存(全局的i);同步任务执行完毕,此时全局的i为4,主线程执行异步任务队列里3个异步任务console.log(i)

2、let

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

执行结果 1,2,3

分析:每执行一次循环将setTimeout交给定时器模块处理,1秒后将任务放进异步队列里,闭包也会把当前的执行上下文环境给保存(此时块级作用域里的i);同步任务执行完毕,主线程执行异步任务队列里3个异步任务console.log(i)

二、排序

   const lessons = [{title: 'a', click: 10, price: 100}, {title: 'b', click: 100, price: 1000}, {title: 'c', click: 110, price: 1100}]
   function order(field, type="asc") {
     return function(a,b){
       if(type === 'asc') {
         return a[field] > b[field] ? 1 : -1;
       } else {
         return a[field] > b[field] ? -1 : 1;
       }
       
     }
   }
   
   let result = lessons.sort(order('price', 'asc'));
  // let result = lessons.sort(order('price', 'des'));
  // let result = lessons.sort(order('click', 'asc'));
   console.table(result);