传递参数
ECMAScript中所有函数的参数都按值传递。方法如同复制变量值。
访问变量有按值和按引用两种方式,参数只能按值传递。
在向参数传递引用类型的值时:把值在内存中的地址复制给一个局部变量,该局部变量的变化会反应在函数的外部。如下:
//验证引用类型参数按值传递而不是按引用传递
function setName(obj) {//3、person被复制给了obj,就是新建了obj指针,obj的值即复制的person的值,
//即对象Object内存地址,所以obj同person一样指向了该对象
obj.name = "Nike";//4、为对象添加name属性并赋值,obj访问name属性
obj = new Object();//5、为obj重新定义一个对象(函数内部定义的对象为局部对象,函数执行完毕后会立即销毁),此时obj不指向函数外部的那个对象了,指向的对象是局部对象
obj.name = "Greg";//6、为该局部对象定义一个不同的name属性,obj(person)访问name属性(指针与对象属性的关系??)
}//7、函数执行完毕后,局部对象被销毁,obj没有再被继续使用,所以也被销毁了
//8、即使在函数内部修改了参数的值,但原始的引用仍然保持不变
var person = new Object();//1、新建一个person指针,指针的值是新建的对象Object的内存地址
//所以person指针指向该对象。
setName(person);//2、person被传递到setName函数中
alert(person.name);//10、输出Nike
//9、person依然指向该外部对象,name属性的值是Nike
如果是错误的认为 按引用传递呢?
//如果是按引用传递,那么***不同之处
function setName(obj) {//***3、person传进了setName,相当于给person起了个小名叫obj,在函数内部使用这个小名,但是人都是person
obj.name = "Nike";//***4、为对象添加name属性并赋值,obj(person)访问name属性(指针与对象属性的关系??)
obj = new Object();//***5、为obj(person)重新定义一个对象(函数内部定义的对象为局部对象,函数执行完毕后会立即销毁),此时obj(person)不指向函数外部的那个对象了,指向的对象是局部对象
obj.name = "Greg";//6、***为该局部对象定义一个不同的name属性,obj(person)访问name属性(指针与对象属性的关系??)
}//***7、函数执行完毕后,局部对象被销毁,obj(person)后面仍被使用,所以没被销毁
//***8、在函数内部更改了person指向的对象和属性
var person = new Object();//1、新建一个person指针,指针的值是新建的对象Object的内存地址,所以person指针指向该对象。
setName(person);//2、person被传递到setName函数中
alert(person.name);//10、输出Greg
//***9、person指向内部对象,name属性的值是Greg
但是!经过测试,输出的是Nike,所以证明Java参数是按值传递而不是按引用传递!