您的位置:首页 > Web前端 > JavaScript

说明JavaScript 函数间按值传参的一个例子

2013-02-10 23:03 183 查看
Javascript 在函数传递间使用的都是按值传递。对于基本类型(number/string/boolean)而言,很好理解。但是对于引用类型而言,可能有时令人困惑。下面一个小列子来说明一下。

function ref(input){
alert(input.value)	//old value
input = new Object()		//3
input.value = "new value"
}

var obj = {value : "old value"}		//1
alert(obj["value"])	//old value
ref(obj)				//2
alert(obj["value"])	// old value


在1处,obj对象的value属性被定义成为“old value”, 此时查询改属性,返回必定是"old value"。然后在2处将obj作为参数传入ref函数。

如果是按引用处理,那么在3处应该是obj的引用地址,针对该地址进行赋值的结果必然是函数返回“new value”。

但实际上,在2处,程序调用ref函数时,传入的并非obj的引用,而是obj引用的一个副本,指向的堆内存与obj地址指向的对象一致。所以才有了再ref函数第一行检查传入对象value属性依然是“old value”的情况发生。此时obj和ref内input引用指向的是一个内存对象。

但在3处input引用被赋予了新的对象,而obj没有变化。所以在函数返回以后,input由于出了函数域而被标记销毁了,obj引用指向的对象没有被改变,依然返回“old value”

这个例子的重点说明的是,javascript中所有的函数都是按值传递参数的,而且传入的参数会被复制为副本。如果参数是引用类型,那么副本就是参数引用变量的副本。副本变量会在函数返回时被销毁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: