高级程序设计中说明,所有函数的参数都是按值传递的。
基本类型
向参数传递基本类型的值时,被传递的值会被复制给对应的命名参数
function addTen(num){ num=+10; return num; } var count=20; var result=addTen(count); alert(count);
在函数内部,num的值被加上10,但不影响外部count变量的值
引用类型
在向参数传递引用类型的值时,把这个值在内存中的地址复制给对应的局部变量,如果这个局部变量没有重新赋值,那它在函数内部的变化将反应到外部
function setName(obj){ obj.name="nichos"; } var person={ name:"richas" }; setName(person); alert(person.name);//nichos
如果被重新赋值给新的对象,这之后变化将不影响外部的变化。
function setName(obj){ obj.name="nichos"; obj=new Object(); obj.name="new name"; } var person={ name:"richas" }; setName(person); alert(person.name);//nichos
下面再转个网友的个例子
var ftn1 = function(){ console.log("test:ftn1"); }; var ftn2 = function(){ console.log("test:ftn2"); }; function ftn(f){ f(); f = ftn2; } ftn(ftn1);// 运行结果:test:ftn1 console.log("====================华丽的分割线======================"); ftn1();// 运行结果:test:ftn1
为什么不是test:ftn2,那是因为参数f被赋值给f2对象的地址后,跟外面的f1已经没关系了,所以结果还是f1
var ftn1 = function(){ console.log("test:ftn1"); }; var ftn2 = function(){ console.log("test:ftn2"); }; function ftn(f){ f();//test:ftn1 f = ftn2; f();//test:ftn2 } ftn(ftn1);// 运行结果:test:ftn1 console.log("====================华丽的分割线======================"); ftn1();// 运行结果:test:ftn1