JavaScript语言核心(四)-- 高阶函数 及 闭包

JavaScript 词法作用域:

当【定义】了一个函数后,当前的作用域就会被保存下来,并且成为函数内部状态的一部分

 

标记及清除的 内存管理方案 解决了循环引用带来的内存泄漏

倾向于认为"闭包" 是保存保存变量的 作用域

在嵌套函数定义中,引用了外层函数的变量,此时闭包才会出现(结合Chrome  devptools查看)

高阶函数的:

  • 函数能够被当做参数传递
  • 函数可以作为返回值

使用场景:

  1. 作为回调函数
  2. 面向切面编程(AOP)   before()  after()  日子记录、异常处理 从核心代码中抽离。(给单一的函数增添职责)
  3. 函数柯里化(延时求值)
  4. 函数uncurry

 

闭包的使用场景:

1.配合理解表达式,创建私有变量

let func = (function(){

  let cache = {};  //用于计算的缓存

  return function(){

    let key = [].jion.apply(arguments,',');

   if(cache[key]){  return cache[key];}

        return cache[key]= 计算值

  }

})();

  

2.延迟局部比变量的生命周期

funciton reportUser(){

  let img = new Image();

  img.src = 'url';  //此时才发生 HTTP请求 (单向的数据通信)

}

函数执行完毕,img被销毁了 可能此时 HTTP请求还没有发送。

let reportUser = (function(){

  let imgs = [];

  return function(){

      let img = new Image();

      img.src = 'url';  //此时才发生 HTTP请求 (单向的数据通信)

          imgs.push(img);

  }

})();

 

posted @ 2017-12-11 17:04  yytiger  阅读(151)  评论(0编辑  收藏  举报