ECMAScript中函数的传参都是按值传递的。
不管是传基本类型的值还是引用类型的值都是按值传递,访问变量则分按值和按引用两种方式。
向参数传递基本类型的值
被传递的值会被复制(对应文章《基本类型和引用类型的值--复制变量值》)给函数内部的一个局部变量。(即命名参数,也就是argument对象的一个元素)
function addTen(num){num += 10;return num;};var count = 20;var result = addTen(count);alter(count); //20,没有变化alter(result); //30复制代码
函数addTen的一个参数num,实际上是函数addTen内部的一个局部变量,仅仅供函数内部使用,count只是将其值复制了一份给了局部变量num。两个变量互不影响。
向参数传递引用类型的值
被传递的值会被复制(对应文章《基本类型和引用类型的值--复制变量值》)给函数内部的一个局部变量,(即命名参数,也就是argument对象的一个元素)和传递基本类型的值一样。不同的是这里的值应该是指引用类型的值对应的内存地址。
function setName(obj){obj.name = 'Zeng';};var preson = "John";setName(preson);alter(preson.name); //"Zeng"复制代码
这样一来,obj和preson引用的是同一个对象。改变obj,就会改变preson,这两个对象指向的对象在堆内存中只有一个。
为什么不是按引用传递的呢?
function setName(obj){obj.name = 'Zeng';obj = new Object(); //一个新的对象重新赋值给obj,这样obj和preson引用的就不是同一个对象了。此时的obj和preson互不影响。obj.name = 'Sam';};var preson = new Object();setName(preson);alert(preson); //Zeng复制代码