英语轻松读发新版了,欢迎下载、更新

遇到个js的问题请教一下各位大佬

finnsun 发布于 2018年09月21日
无人欣赏。

没弄懂下面两种清空方法有什么区别,请各位大佬指点一下一下QAQ

a()
c()
function a() {
  var foo = ['test']
  setTimeout(()=>{
    console.log(foo) // ['test'] foo不变
  }, 1000)
  b(foo)
}
function b(foo) {
  foo = []
}

function c() {
  var foo = ['test']
  setTimeout(()=>{
    console.log(foo) // // [] foo被清空
  }, 2000)
  d(foo)
}
function d(foo) {
  foo.splice(0,foo.length)
}
共3条回复
tinyfool 回复于 2018年09月21日

这种题目好像没啥意义

jiaowochunge 回复于 2018年09月21日

尝试一波。 第一种方式,我改写下参数的名字 function b(foo1) { foo1 = [] } 那么,实际上,就是 foo1 与 foo 指向同一个对象,在函数 b 中,foo1 的指向被修改,不影响 foo 的指向。修改的是 foo1 的指向,而不是指向的内容。 有了这层解释,第二种方式就容易理解了。修改了指向的内容。 大意就是这么回事

dpwwwq 回复于 2018年09月22日

《JavaScript高级程序设计》第70页 “ECMAScript中所有函数的参数都是按值传递的,引用类型值的传递则如同引用类型变量的复制一样” “在向参数传递基本引用类型的值时,会把这个值在内存中的地址复制给一个局部变量”。

所以 b(foo) 使得 function b 中的局部变量 foo 指向了function a中局部变量 foo 所指向的对象" ['test'] ",在function b中将 foo = [ ] 实际上也就是将function b 中的局部变量 foo 指向了 "[ ]",并没有改变function a 中 foo 所指向的对象。而function d 中局部变量 foo 指向了 function c 中局部变量foo所指向的对象" ['test'] ",并用该对象上的方法修改了该对象本身的内容,所以 function c 中foo所指向的对象内容改变了。

登录 或者 注册