js对象按值传递的一些问题

这篇博客探讨了JavaScript中对象和函数的引用特性。通过实例解释了对象和函数作为值传递时的地址变化,以及闭包在内存管理中的作用。讨论了箭头函数的特性和如何影响函数引用。最后,展示了如何在函数内部改变外部变量的引用,并分析了其对内存和执行的影响。
摘要由CSDN通过智能技术生成

2022/07/24

let obj = {
	name:"zs"
}
let arr = []
arr.push(obj)
obj.name = "ls"
arr // 这时的arr是[{name: 'ls'}],因为对象是按值传递的,很好理解。

obj = {
	age:12
}
arr  // 还是[{name: 'ls'}], 因为obj被赋值了一个新的地址,所以新的obj和arr里面的旧的obj所引用的地址是两个地址。

我们在看一个例子

let fn1 = function(param1){}
fn1.key1 = 'key1'

let arr = []
arr.push(fn1)
arr[0] // ƒ (param1){}
arr[0].key1 // 'key1'

fn1.key1 = 'key2'
arr[0] // ƒ (param1){}
arr[0].key1 // 'key2'

fn1 = function(param2){}
arr[0] // ƒ (param1){} 
arr[0].key1 // 'key2'

这里的函数和上面obj对象的逻辑是一样的, fn1被赋值了一个新的地址,所以新的fn1和旧的fn1所引用的地址是两个地址。

2022/07/25
我们在看一个例子:

let fn1 = () => console.log(fn1)
let arr = []
arr.push(fn1)
arr[0]() // () => console.log(fn1)

fn1 = () => {}
arr[0]() // () => {}

当第二次调用arr[0]的时候,好像有点令人迷惑,其实当执行fn1 = () => {}的时候,数组里面的fn1和外界的fn1就已经是两个东西了,而当第二次执行arr[0]时,相当于(() => console.log(fn1))(),所以会检索fn1是什么,这样就检索到了外界的() => {}

2022/07/27
好的,我又来写一个例子:

let activeFn;
function effect(){
    let effectFn = () => {
        activeFn = effectFn
        console.log(effectFn)
    }
    effectFn()
}

effect() 
// () => {
//   activeFn = effectFn
//   console.log(effectFn)
//}
activeFn()
// () => {
//   activeFn = effectFn
//   console.log(effectFn)
//}

这里应该思考的是,当effect执行之后,内部的effectFn就会执行,这样activeFn就有引用了,那么当执行activeFn的时候console.log(effectFn),这句代码中的effectFn是否还会被引用。
确实还是会被引用,这个就和闭包有关系了,外部对象引用了内部对象,那么这个内部对象所引用的相关内容就不会被gc回收,也就是垃圾回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值