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回收,也就是垃圾回收。