地址空间的坑
代码:
unction fn(obj) {
obj.name = 'Rose'
obj = new Object()
obj.name = 'Tom'
}
var obj = { name: 'Jack' }
fn(obj)
console.log(obj.name) // Rose
解析:
function fn(obj) {
// 此时 形参obj 存储的内容就是 空间地址(xf001)
// 利用 形参obj 修改 name 属性的值
// 把 全局obj 这个空间内的 name 修改为 Rose 了
obj.name = 'Rose'
// 此时给 形参obj 从新赋值为一个新的对象空间地址(xf002)
obj = new Object()
// 此时 形参obj 修改name 属性修改的是 xf002 地址内的 name
// 不影响 全局obj
obj.name = 'Tom'
}
// 全局obj 被赋值为一个对象空间地址(xf001), 内部存储一个 name:'Jack'
var obj = { name: 'Jack' }
// 调用 fn , 把 全局obj 传递进去, 真实给进去的是 空间地址(xf001)
fn(obj)
console.log(obj.name) // Rose
赋值的坑
function fn(obj) {
// 本身私有空间内存在一个私有变量 obj, 接受的值是 全局obj(xf001)
// 预解析阶段, 声明一个 obj 变量, 没有意义
obj.name = 'Rose'
var obj = new Object()
obj.name = 'Tom'
}
var obj = { name: 'Jack' }
fn(obj)
console.log(obj.name) // Rose
// 面试题
function fn() {
// 在函数内代码执行之前, 会进行预解析
// 在 fn 空间内声明一个私有变量, 叫做 obj, 但是没有赋值, 此时 obj 是 undefined
// 执行代码
// obj.name = 'Rose'
// 此时 obj 是 undefined, 你执行的就是 undefined.name = 'Rose'
obj.name = 'Rose'
var obj = new Object()
obj.name = 'Tom'
}
var obj = { name: 'Jack' }
fn(obj)
console.log(obj.name)//报错
// 面试题
function fn() {
// 此时 obj 就是 全局obj(xf001)
// 给 全局obj 内修改 name 属性
obj.name = 'Rose'
// 给 全局obj 从新赋值为一个新的对象(xf002)
obj = new Object()
// 给 全局obj(xf002) 赋值一个 name 属性为 Tom
obj.name = 'Tom'
}
var obj = { name: 'Jack' }
fn(obj)
// 打印的是全局obj
// 因为 fn 函数的执行, 把全局obj 修改为了 (xf002)
console.log(obj.name)//Tom