函数高级
18:函数高级
一、闭包函数
1. 函数定义阶段
- 在堆内存中开辟一段存储空间
- 把函数体内的代码存储在这一段空间内
- 把堆空间地址赋值给栈内存中的变量
2. 函数调用阶段
- 按照变量名内的空间地址找到堆内存中对应的存储空间
- 在调用栈中开辟一段新的作用域执行空间
- 在执行空间中进行形参赋值
- 在执行空间中进行预解析(声明提升,检查报错等)
- 在执行空间中完整执行一遍函数内的代码
- 将当前作用域执行空间,销毁
3. 不会销毁的函数执行空间
- 当函数内返回了一个复杂数据类型
- 并且函数外部有变量接收了这个复杂数据类型
- 函数执行完毕后的执行空间不会被销毁
1 | function fn() { |
4. 闭包
- 概念:通过作用域的嵌套,将原本的局部变量(原本要删除的数据)进化成私有变量的过程,叫闭包
- 原理:利用了不会被销毁的执行空间,保存原本要删除的数据
- 创建一个不会被销毁的作用域执行空间
- 直接 或 间接 返回一个函数(复杂数据)
- 外部有变量接收的返回的复杂数据
- 返回的这个函数使用了外部函数的局部变量(私有变量)
1 | function fn(){ |
- 特点
- 可以在函数外面控制到函数内部的变量
- 避免全局变量命名空间的污染
- 延长了变量的生命周期(多占用内存)
- 因为存在不会销毁的空间,低版本浏览器会造成内存溢出
- 沙箱模式
1 | function outer() { |
二、函数防抖
- 函数防抖:
- 短时间内快速触发同一个事件
- 执行之前都先干掉上一次,保证只执行最后一次
- 特点:
- 提升执行速度,节省资源
- 使用
setTimeout
实现函数防抖
1 | var t = null; |
- 应用场景 - 一些高频事件,在被连续触发时,其实只需要生效一次即可,如:
- 搜索框搜索输入:只需用户最后一次输入完,再发送请求
- 以此可以延伸出手机号、邮箱等输入时的实时验证
- 窗口大小事件onresize,只需窗口调整完成后,计算窗口大小,防止重复渲染
三、函数节流
- 函数节流:
- 短时间内快速触发同一个事件
- 上次执行未结束,不能再次触发,一次执行完毕后,才能触发下一次
- 特点:
- 提升执行速度,节省资源
- 使用 状态的概念 实现函数节流
1 | var t = null; |
- 应用场景
- DOM 元素的拖拽(mousemove)
- 射击游戏在单位时间只能发射一颗子弹(mousedown/keydown)
- 搜索联想(keyup)
- 懒加载,在滚动过程中判断是否需要加载图片(scroll)
四、函数的柯里化(Currying)
- 是一种函数的高阶技术,用于函数的转换,并不会执行函数。可将一次传入多个参数的函数,转换为多次执行一次执行传入一个参数的函数
- 如:
fn(1,2,3)
转换为fn(1)(2)(3)
- 利用了闭包, 把第一次传递的参数保存下来(延长生命周期)
- 也可以保存程序的逐步执行结果
- 如:
1 | function fn(a, b){ |
五、递归
应用
深拷贝
任一层,都是只拷贝值
复杂数据:对象,数组,函数
对象的遍历
数组的遍历
函数的深拷贝:bind
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 !
评论