传值(pass by value)的函数调用方式

2010.3.31补充说明:
我特别奇怪为什么看文章的人不去看我推荐的
1,Pass-by-Value Please (Cup Size continued)
2,Java is Pass-by-Value, Dammit!
两篇文章呢????算了,再补上一篇中文文章 JavaScript 传递参数是值传递?还是值传递?

按引用传递应该在c语言里面提到,而后c++语言里面也有,Javascript 应该在c++语言之后出现,actionscript 语言基于javascript语言,所以actionscript 语言出现的最晚。所以我建议读者先看看c/c++语言是怎么解释 按值传递 和 按引用传递 的然后再看我这篇文章。

别太迷信Adobe帮助文档上的胡言乱语,因为写文档的人也只是一个人,他不一定比你高明多少。

写这篇文章的初衷不是想把大家搞糊涂,而是想让大家都知道这个事实,现在看来有点适得其反。看不懂的读者不要钻牛角尖了,会用就行,不懂就不懂,何必强求,这个世界那么多的未知,怎么可能都被你知道呢
————————————————————————————————————————————————

ActionScript 3函数调用采用的是“按值传递方式”,代码胜千言
程序代码 程序代码

private var list:Array = ["hello", "world", "!"];


private function onInit():void
{
    trace("befor: " + list.toString());
    test(list);
    trace("after: " + list.toString());
}

private function test(v:Array):void
{
    v = ["another", "hello", "?"];
    trace(v.toString());
}


输出如下:
程序代码 程序代码

befor: hello,world,!
another,hello,?
after: hello,world,!


看完了是不是有点迷惑,不要紧,再仔细想想,想明白就行。

-------------------------------------------------------------------------
2009.12.31补充说明:
Adobe官方帮助文档函数参数-按值或按引用传递参数一节中有这样一句话:
引用内容 引用内容
在 ActionScript 3.0 中,所有的参数均按引用传递,因为所有的值都存储为对象。

我不知道是不是的Adobe的工程师自己本身都没有了解什么是按值传递(pass by value),什么是按引用传递(pass by reference),或者是Adobe的工程师对于pass by reference有自己的一套解释???
从本质来讲ActionScript 3.0 中,所有的参数均按值传递才对。
按值传递(pass by value)和按引用传递(pass by reference)的精彩解释可以参考下面两篇文章
1,Pass-by-Value Please (Cup Size continued)
2,Java is Pass-by-Value, Dammit!
-------------------------------------------------------------------------


[本日志由 Admin 于 2010-03-31 02:13 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
评论: 10 | 引用: 0 | 查看次数: 1335
回复回复wewell[2010-04-04 00:18 AM | del]
事实胜于雄辩
test(list)
这一句意义是把list的引用传给test(a:Array)中的a了

等同于下面这句
var a:Array = list

看debug信息窗中的引用可以验证以上结论,a和list持有相同的引用,指向同一块内存地址@13f48c9
adobe说的传引用是没有错的!

然后
a = ["another", "hello", "?"]
问题在这里,把a从指向@13f48c9改为指向另一块内存地址@13f4859
//@13f4859就是new Array("another", "hello", "?")的地址

此时
list  仍为@13f4859
a  变为@13f4859
输出结果自然为博主所示了

至此,真相大白,此问题可以停止讨论了:0


回复回复不要误导新人[2010-03-30 05:58 PM | del]
我很无语
AS3是按引用传输。不要受博主误导。
博主写的代码相当于给了v一个新的引用。

劝博主把这篇文章删了吧。别影响自己名声
回复回复say[2010-03-27 09:25 PM | del]
同意 eidiot 的说法
回复回复freeyouth[2010-03-17 03:27 PM | del]
看完了你推荐的文章,才明白为什么传个对象进去也叫按值传递。因为复制的是remote control.但也许人Adobe公司理解的不一样吧,最终写程序的时候也不会用错,只是叫法不同。我还很认同java里的pass-by-value说法的~~~
回复回复assin[2010-03-14 00:42 AM | del]
楼上的朋友 按引用的话  你PUSH 应该是 添加到数组的最后的啊  最后一行输出应该是
after: hello,world,!,?   了

我竟然用方法传进来一个对象 修改里面的属性和值  这都没问题啊 一直是按照引用传递 而改变的。。。这段代码 究竟为什么 没看懂  
回复回复HappyApple[2010-02-06 01:51 PM | del]
我觉得ActionScript的传引用是类似C++的指针传递方式,而不是C++的引用传递方式…
如果当成C++引用传递方式就会觉得不对劲了~
回复回复eidiot[2010-01-16 10:10 PM | del]
代码很明白,不需要想:
v = ["another", "hello", "?"];
这行代码创建了一个新的数组给v,下面的trace已经和传进来的参数无关了。去掉这行代码,用个改变数组本身的方法比如 push() 再试试?真的很明白,实在没啥好想的。

引用来自 华特 引用来自 华特
二位没有想明白,接着想。
如果真是 按引用传递 为什么不是输出

befor: hello,world,!
another,hello,?
after: another,hello,?
回复回复华特[2009-12-25 06:16 PM | del]
二位没有想明白,接着想。
如果真是 按引用传递 为什么不是输出

befor: hello,world,!
another,hello,?
after: another,hello,?
回复回复吗啡[2009-12-24 10:39 AM | del]
这测试代码恰好说明as3是按引用传递的,使用 [] 等于 new Array()的效果。
回复回复eidiot[2009-12-23 07:31 PM | del]
as3是按引用的,你这个测试代码有问题,
    v = ["another", "hello", "?"];
改成
v.push("?");
再试试?
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭