天天看点

【面试集合(更)】web前端经典面试题试题及答案JavaScript

地址空间的坑

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      

继续阅读