JavaScript语言核心(四)-- 高阶函数 及 闭包
JavaScript 词法作用域:
当【定义】了一个函数后,当前的作用域就会被保存下来,并且成为函数内部状态的一部分
标记及清除的 内存管理方案 解决了循环引用带来的内存泄漏
倾向于认为"闭包" 是保存保存变量的 作用域
在嵌套函数定义中,引用了外层函数的变量,此时闭包才会出现(结合Chrome devptools查看)
高阶函数的:
- 函数能够被当做参数传递
- 函数可以作为返回值
使用场景:
- 作为回调函数
- 面向切面编程(AOP) before() after() 日子记录、异常处理 从核心代码中抽离。(给单一的函数增添职责)
- 函数柯里化(延时求值)
- 函数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); } })();