闭包、递归、深拷贝浅拷贝
什么是闭包:有权访问另一个函数作用域中变量的函数。
简单来说就是一个作用域可以访问另一个函数内部的局部变量。
闭包的作用:
-
隐藏变量,避免全局污染
-
可以读取函数内的变量
同时闭包使用不当,优点就变成了缺点:
缺点1:导致变量不会被垃圾回收机制回收,造成内存消耗
缺点2:不恰当的使用闭包可能会造成内存泄漏的问题
这里简单说一下,为什么使用闭包时变量不会被垃圾回收机制收销毁呢,这里需要了解一下
JS垃圾回收机制;
JS规定在一个函数作用域内,程序执行完以后变量就会被销毁,这样可节省内存;
使用闭包时,按照作用域链的特点,闭包(函数)外面的变量不会被销毁,因为函数会一直被调用,所以一直存在,如果闭包使用过多会造成内存销毁。
- 基本类型储存在栈中,但是⼀旦被闭包引⽤则成为常住内存,会储存在内存堆中。
- 复杂类型会储存在内存堆中。
自由变量的查找,是在函数定义的地方查找,向上级作用域查找,不是在执行的地方查找。
函数的this指向,函数this的确定是在函数执行的时候确认的不是在函数定义的时候确认的
function create() {
const a = 100
return function() {
console.log('a='+a)
}
}
const f = create()
const a = 200
f() //a=100
function print(fn) {
const b = 300
fn()
}
const b = 400
function fn() {
console.log('b='+b)
}
print(fn) //b=400
什么是递归:递归就是自己调用自己
深拷贝和浅拷贝
深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
- 浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
- 深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。
通俗一点理解就是浅拷贝出来的数据并不独立,如果被复制的对象改变了,那么浅拷贝的对象也会改变,深拷贝之后就会完全独立,与浅拷贝断绝关系。
简单的复制赋值
值类型就是深拷贝,引用类型就是浅拷贝
引用类型:对象、数组、null
1.浅拷贝:浅拷贝只是拷贝一层,更深层次的对象级别只拷贝引用
拷贝元素没有区别,拷贝数组、对象就是拷贝地址。
es6新增浅拷贝:Object.assign(拷贝给谁,拷贝的对象)
2.深拷贝:深拷贝拷贝多层,每一层级别的数据都会拷贝。
深拷贝会将数组和对象里面的内容再复制一份,而不是仅仅是复制地址。
//递归来实现深拷贝
function deepClone(obj){
var newObj = obj instanceof Array ? []:{};
if(typeof obj !== 'object'){
return obj;
}else {
for(var i in obj) {
newObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i];
}
}
return newObj;
}
var q = [1, 2, 4, 6, { age: 12 }, [1, 2]];
var d = deepClone(q)
console.log(d)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了