JavaScript 函数参数传递到底是值传递还是引用传递
目前成都创新互联已为上1000家的企业提供了网站建设、域名、虚拟主机、网站托管、服务器托管、企业网站设计、昌都网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
一 参数
1 所有的参数传递,都是传递值的拷贝。(如果想知道为什么,去学习编译原理的函数调用的参数压栈和出栈对应内容)。
2 C传指针进去,其实也是把这个指针值按拷贝传送进去。但是因为指针值指向一块外部内存空间(其实更多是堆空间,或外层栈变量空间),所以感觉可以在函数里改变外部变量。其实本质还是按拷贝传递,只是传递进去的是一个访问变量的渠道。
因此,如果我们希望函数内能改变外部的指针值,往往传进去的是指针变量的指针。呵呵,很多初学C的程序员,对**非常难理解。
二 返回值
返回值是按拷贝传递,函数出栈后,会传出一个值,该值在调用函数的代码段的生命周期里一直有效。相当与调用点形成一个匿名的栈变量。
变量a = function(); 而a并不等于函数里return的那个值。
其实function()执行结果自身就是一个匿名变量。(其实编译器会检查语法,如上面a=function这样的语法,匿名变量不会生成,直接使用a变量拷贝返回值)
例如: function()返回int值。 完全可以 int x = function() + 6;//注意:+运算时,函数已经执行完毕,所有函数出栈操作已经结束。
很明显function()必须有一个变量或常量参与计算,而函数里return的值会随函数调用结束出栈而被删除,所以必须拷贝构造传递出来。
javascript函数参数是值传递,不是地址传递,所以Sum函数中调用change(x,y,z);并不会影响x,y,z的值,也就是Sum函数中change(x,y,z);没有一点作用,当然结果是2+3+5不是4+5+10。
方法一:通过事件在html中的内联方式来传递参数(假定变量x是参数,下同):
input type="button" value="点我" onclick="var x=123;test(x);"/
script
function test(x){
alert(x);
}
/script
方法二:通过全局变量来传递参数:
input id="abc" type="button" value="点我"/
script
var x=123;
window.onload=function(){
document.getElementById("abc").onclick=function(){
alert(x);
}
}
/script
方法三:通过对象的自定义属性来传递参数:
input id="abc" type="button" value="点我"/
script
window.onload=function(){
var abc=document.getElementById("abc");
abc.x=123;
abc.onclick=function(){
alert(this.x);
}
}
/script
方法四:利用闭包:
input id="abc" type="button" value="点我"/
script
window.onload=function(){
(function(x){
document.getElementById("abc").onclick=function(){
alert(x);
}
})(123);
}
/script
暂时就想到这么多了,肯定还有其他方法的。
1、定义二个方法
function k1(){//定义一个函数k1
alert('k1');
}
function k2(p){//定义一个函数k2,参数为方法
p();//执行参数表示的函数
}
2、k1作为参数,传递到k2中
k2(k1);//把k1作为参数传入到k2中,这里执行后会弹出 "k1"