Js 中所有函数的参数传递都是按值传递的,也就是把函数外面的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。下面举几个特别的例子
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
1、基本数据类型传递参数:
- funciton addTen(num){
- num+=10;
- return num;
- }
- var count=20;
- var result=addTen(count);
- alert(count);//20
- alert(resullt);//30
执行结果是:20 和 30。在这段代码中,将变量 count 当做参数传递给了函数 addTen,也就是相当于将变量 count 的值复制给了函数 addTen 的参数。这时 addTen 的参数 num 可以看做是函数内部的一个变量。在上段代码中,就相当于两个基本数据类型变量之间的值复制。而基本数据类型都有自己独立的内存地址,所以 num 和 count 是没有任何关系的,他们只是值相等而已,函数执行完毕后,count 的值并没有改变。而函数外面的 result 是被直接赋值的,所以 result 的值就是函数的结果 30。
2、引用类型传递参数:
- function setName(obj){
- obj.name="LSN";
- }
- var person=new Object();
- setName(person);
- alert(person.name);//LSN
执行结果是:LSN。在这段代码中,函数 setName 的作用是给 obj 对象添加了一个属性 name 并给该属性赋值为 "LSN", 因为 obj 是引用类型,所以这里属于是将引用类型 person 赋值给了 obj,也就是说 person 和 obj 引用了一个内存地址,所以当给 obj 新加了属性 name 时,在函数外面的 person 也跟着改变,最后 person.naem 的结果为 LSN。
3、引用类型传递参数到底传的是值还是引用
- function setName(obj){
- obj.name="ABC";
- obj=new Object();
- obj.name="BCD";
- }
- var person=new Object();
- setName(person);
- alert(person.name);// ABC
执行结果是:ABC。实例 3 与实例 2 的区别是在函数中又加了 2 行代码,在给 obj 对象新加一个属性 name 并赋值后 又将 obj 定义成了一个新的对象(new Object()),定义新对象后又 name 赋上新的值"BCD"。这个时候如果是按引用传递的话,那么最后 person 对象就会自动修改为指向其 name 属性为"BCD"的新对象,但最后显示的却是"ABC",这说明即使在函数内部修改了参数的值,但原始的引用还保持不变。实际上,当在函数内部 obj=new Object() 时 这个新的 obj 就已经成为函数内部的局部对象了,这个对象会在函数执行完毕后自动销毁。
来源: