// 1.
// var obj = { name: 'Jack' }
// function fn() {
// obj.name = 'Rose'; // 修改的 全局的 obj, 全局obj 被修改为 {name:'rose'}
// obj = {}; // 修改全局的 obj, 给一个新的空对象
// obj.name = 'Jerry'; // 修改全局的 obj, 给新对象添加一个 name属性 对应的值 jerry
// console.log(obj.name); // Jerry
// }
// fn()
// console.log(obj.name); // Jerry
// // 2.
// var obj = { name: 'Jack' }
// function fn() {
// obj.name = 'Rose' // 此时 obj 因为变量提升只提升定义, 所以为 undefined , 所以这里报错
// var obj = {}
// obj.name = 'Jerry'
// console.log(obj.name) // Jerry
// }
// fn()
// console.log(obj.name) // Jack
// /*
// 自己写的代码:
// function fn() {
// obj.name = 'Rose'
// var obj = {}
// obj.name = 'Jerry'
// console.log(obj.name) //
// }
// 预解析
// function fn() {
// obj.name = 'Rose' // 不需要
// var obj = {} // 需要
// obj.name = 'Jerry' // 不需要
// console.log(obj.name) // 不需要
// }
// 变量提升后
// function fn() {
// var obj; ---> undefined
// obj.name = 'Rose' ---> undefined.name
// obj = {}
// obj.name = 'Jerry'
// console.log()
// }
// */
// // 3.
// var obj = { name: 'Jack' }
// function fn(obj) {
// obj.name = 'Rose' // 参数 obj 的 name 属性修改为 Rose, 因为引用数据类型传参, 传的是地址, 所以会影响外部的对象
// var obj = {} // 参数 obj 重新赋值为, 现在 参数obj的引用地址, 和全局对象obj的引用地址, 已经不一样了
// obj.name = 'Jerry' // 参数 obj 对象 添加一个属性 name 值为 Jerry
// console.log(obj.name) // 参数 obj 对象的 name ---> Jerry
// }
// fn(obj)
// console.log(obj.name) // Rose
/*
自己写的
function fn(obj) {
obj.name = 'Rose'
var obj = {}
obj.name = 'Jerry'
console.log(obj.name) //
}
预解析
function fn(obj) {
obj.name = 'Rose' // 不需要
var obj = {} // 需要
obj.name = 'Jerry' // 不需要
console.log(obj.name) // 不需要
}
变量提升后
function fn(obj) {
var obj; ---> undefined
obj.name = 'Rose'
obj = {}
obj.name = 'Jerry'
console.log(obj.name)
}
*/
// // 4.
var obj = { name: 'Jack' }
function fn(obj) {
obj.name = 'Rose' // 参数 obj 的name属性 修改为 Rose, 因为传参是引用数据类型, 所以是传递的地址, 所以这里会改变外部对象的属性
obj = {} // 参数 obj 重新赋值为空对象, 相当于 更改它内部的 引用地址, 此时参数obj和全局obj不是一个引用地址
obj.name = 'Jerry' // 参数obj新增一个 name 属性 值为 Jerry
console.log(obj.name) // 参数 obj.name ---> Jerry
}
fn(obj)
console.log(obj.name) // 全局obj ---> Rose