从一个例子误区来理解JavaScript是按照值传递参数

2018-07-31  本文已影响19人  89089答复

关键字:参数值的传递、基本类型值、引用类型值、执行环境、垃圾回收、作用域链、闭包

function addProp(obj){
obj.name='lily';
}
var person =new Object();
addProp(person);
console.log(person.name);//lily
var obj1 = {
  value:'111'
};
 
var obj2 = {
  value:'222'
};
 
function changeStuff(obj){
  obj.value = '333';//obj1和obj此时指向同一个对象,obj属性的概念必然影响obj1,按照对象复制原则
  obj = obj2;//obj的引用被初始化改成了引用另外一个对象
  return obj.value;
}
 
 
var foo = changeStuff(obj1);
 
console.log(foo);// '222' 参数obj指向了新的对象obj2
console.log(obj1.value);//'333'


var v1 = []
var v2 = {};
var v3 = {};
function foo(v1, v2, v3)
{
    v1 = [1];
    v2 = [2];
    v3 = {a:3}
}

foo(v1, v2, v3);
alert(v1); // 空白
alert(v2); // [object Object]
alert(v3.a); // undefined
<!-- 解析:执行foo();实参和形参完成地址的复制,函数体内的v1,v2,v3是三个对象的指向了另外一个对象,可以理解为重新声明了一下,初始化了,但对于外层的三个参数没影响,其指针没变 -->
上一篇 下一篇

猜你喜欢

热点阅读