传值(pass by value)的函数调用方式
作者:Admin 日期:2009-12-23
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官方帮助文档函数参数-按值或按引用传递参数一节中有这样一句话:
引用内容
我不知道是不是的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!
-------------------------------------------------------------------------
我特别奇怪为什么看文章的人不去看我推荐的
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!
-------------------------------------------------------------------------
评论: 10 | 引用: 0 | 查看次数: 1335
我很无语
AS3是按引用传输。不要受博主误导。
博主写的代码相当于给了v一个新的引用。
劝博主把这篇文章删了吧。别影响自己名声
AS3是按引用传输。不要受博主误导。
博主写的代码相当于给了v一个新的引用。
劝博主把这篇文章删了吧。别影响自己名声
同意 eidiot 的说法
看完了你推荐的文章,才明白为什么传个对象进去也叫按值传递。因为复制的是remote control.但也许人Adobe公司理解的不一样吧,最终写程序的时候也不会用错,只是叫法不同。我还很认同java里的pass-by-value说法的~~~
楼上的朋友 按引用的话 你PUSH 应该是 添加到数组的最后的啊 最后一行输出应该是
after: hello,world,!,? 了
我竟然用方法传进来一个对象 修改里面的属性和值 这都没问题啊 一直是按照引用传递 而改变的。。。这段代码 究竟为什么 没看懂
after: hello,world,!,? 了
我竟然用方法传进来一个对象 修改里面的属性和值 这都没问题啊 一直是按照引用传递 而改变的。。。这段代码 究竟为什么 没看懂
我觉得ActionScript的传引用是类似C++的指针传递方式,而不是C++的引用传递方式…
如果当成C++引用传递方式就会觉得不对劲了~
如果当成C++引用传递方式就会觉得不对劲了~
代码很明白,不需要想:
v = ["another", "hello", "?"];
这行代码创建了一个新的数组给v,下面的trace已经和传进来的参数无关了。去掉这行代码,用个改变数组本身的方法比如 push() 再试试?真的很明白,实在没啥好想的。
引用来自 华特
v = ["another", "hello", "?"];
这行代码创建了一个新的数组给v,下面的trace已经和传进来的参数无关了。去掉这行代码,用个改变数组本身的方法比如 push() 再试试?真的很明白,实在没啥好想的。
引用来自 华特二位没有想明白,接着想。
如果真是 按引用传递 为什么不是输出
befor: hello,world,!
another,hello,?
after: another,hello,?
如果真是 按引用传递 为什么不是输出
befor: hello,world,!
another,hello,?
after: another,hello,?
二位没有想明白,接着想。
如果真是 按引用传递 为什么不是输出
befor: hello,world,!
another,hello,?
after: another,hello,?
如果真是 按引用传递 为什么不是输出
befor: hello,world,!
another,hello,?
after: another,hello,?
这测试代码恰好说明as3是按引用传递的,使用 [] 等于 new Array()的效果。
as3是按引用的,你这个测试代码有问题,
v = ["another", "hello", "?"];
改成
v.push("?");
再试试?
v = ["another", "hello", "?"];
改成
v.push("?");
再试试?
发表评论
上一篇
下一篇

文章来自:
Tags:
回复
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