JS中的参数传递竟然都是传值的?怎么能这样?!!

zouwork 2003-06-19 02:06:25
s=""
function(s)
{
//change s
retrun boolean
}

alert(s);
用返回值是不行了,已经其他用了,S也不能是全局的,(否则function(s)怎么独立出来)
那我怎么知道通过函数后的s?给个不要太复杂的办法~~吧~~
...全文
841 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zouwork 2003-06-22
  • 打赏
  • 举报
回复
谢谢: emu(ston)
最近项目很紧~只能先变通的实现功能了
关于JS的详细实现~~有机会一定补上这棵
emu 2003-06-22
  • 打赏
  • 举报
回复
zouwork(了解) :

----------------------------------------------------------
可还是觉得JS里是PASS BU VALUE的
不爽~
----------------------------------------------------------

其实前面已经帖过了:
---------------------------------------------------------------------------
传递参数给函数
按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。
---------------------------------------------------------------------------

其实就是传值,但是可以通过对象引用来修改传进来的对象,上面微软的例子也很能说明问题,请仔细研究“I was changed”是怎么出来的。

lyzcom(寒轩):全局变量在不得已的情况下用(比如setTimeout或者调用vbscript),如果只是要在js函数中修改传递进来的参数的话尽量采用更变通的方法。比如:

这样不行,因为传的是“值”:

function add(n){
n++;
}
var n = 1;
add(n);
document.write(n)


这样就可以,因为传的是对象引用,在调用过程复制后传给函数的参数是指向同一个对象的引用:

function add(n){
if (n.value) n.value++;
}
var n = new Object();n.value=1
add(n);add(n);add(n);
document.write(n.value);



lyzcom 2003-06-21
  • 打赏
  • 举报
回复
我做了测试,除非你直接去修改全局变量的值,否则,将一个全局变量做为参数传递然后在过程中进行修改,是不会影响全局变量的。。。。
zouwork 2003-06-21
  • 打赏
  • 举报
回复
可还是觉得JS里是PASS BU VALUE的
不爽~
zouwork 2003-06-19
  • 打赏
  • 举报
回复
原来是指向windows对象啊,清楚了,谢谢~
emu 2003-06-19
  • 打赏
  • 举报
回复
其实是符合的,是你没有理清楚关系。

如果你用function来构造对象: new functionName() 的话,this指被构造的对象。

但是直接调用的时候,是指function所属的对象,即你可以通过哪个对象访问到function,比如:

<button id = btn>test</button>
<SCRIPT LANGUAGE="JavaScript">
btn.onclick=function (){alert(this.outerHTML)}
</SCRIPT>

这里的函数只能通过btn.onclick来访问到,所以this指btn这个按钮。

而直接定义一个函数,其实相当于在window对象之下创建方法:

function test(){alert("hello");}
window.test();

只不过一般我们不写这个上层对象window(一般在不引起歧义的时候可以省略),而直接写方法名,所以这个函数的this理所当然的要指向window对象了,而this.s也就指向了windos之下定义的全局变量s。

zouwork 2003-06-19
  • 打赏
  • 举报
回复
JavaScript这个东西就是不爽~~语法乱的很~
this.s为什么是指那个全局变量?不符合this的语意啊~
emu 2003-06-19
  • 打赏
  • 举报
回复
等效的例子如下:
var s1="";
function aa(s2)
{
this.s1 =s2;
s2 = s2+s2;
return s2;
}

alert(aa(123));
alert(s1);
emu 2003-06-19
  • 打赏
  • 举报
回复
三楼的例子是错的,见下面的注释:

var s=""; //定义了全局变量s
function aa(s) //
{
this.s =s; //把参数s赋值给全局变量s
s = s+s; // 计算返回值
return s; // 返回计算结果
}

alert(aa(123)); //执行函数
alert(s); //打印被修改后的全局变量

</script>

我们看到的s值的改变不是因为被传递进函数后被改变了,而是通过全局变量引用改变的。
emu 2003-06-19
  • 打赏
  • 举报
回复
首先,那是m$的文档,不是我的理论。

其次,你没有仔细看懂,不然就不会得出上面的结论了,因为文档中已经给出的例子已经充分说明了问题。
zouwork 2003-06-19
  • 打赏
  • 举报
回复
照二楼的理论~

var s="";
function aa(s)
{
s="1+1";
}
调用aa(s)后
alert(s);
应该是1+1吧~,可结果不是
感觉JS中是PASSED BY VALUE的

三楼的this.s 是指什么那个?指那个全局s么?不符合this的语意啊


lsrzm 2003-06-19
  • 打赏
  • 举报
回复
运行一下,就知道了
<script>

var s="";
function aa(s)
{
this.s =s;
s = s+s;
return s;
}

alert(aa(123));
alert(s);

</script>
emu 2003-06-19
  • 打赏
  • 举报
回复
JScript

复制、传递和比较数据
在 JScript 中,对数据的处理取决于该数据的类型。

按值和按引用的比较
Numbers 和 Boolean 类型的值 (true 和 false) 是按值来复制、传递和比较的。当按值复制或传递时,将在计算机内存中分配一块空间并将原值复制到其中。然后,即使更改原来的值,也不会影响所复制的值(反过来也一样),因为这两个值是独立的实体。

对象、数组以及函数是按引用来复制、传递和比较的。当按地址复制或传递时,实际是创建一个指向原始项的指针,然后就像拷贝一样来使用该指针。如果随后更改原始项,则将同时更改原始项和复制项(反过来也一样)。实际上只有一个实体;“复本”并不是一个真正的复本,而只是该数据的又一个引用。

当按引用比较时,要想比较成功,两个变量必须参照完全相同的实体。例如,两个不同的 Array 对象即使包含相同的元素也将比较为不相等。要想比较成功,其中一个变量必须为另一个的参考。要想检查两个数组是否包含了相同的元素,比较 toString() 方法的结果。

最后,字符串是按引用复制和传递的,但是是按值来比较的。请注意,假如有两个 String 对象(用 new String("something") 创建的),按引用比较它们,但是,如果其中一个或者两者都是字符串值的话,按值比较它们。

注意 鉴于 ASCII 和 ANSI 字符集的构造方法,按序列顺序大写字母位于小写字母的前面。例如 "Zoo" 小于 "aardvark"。如果想执行不区分大小写的匹配,可以对两个字符串调用 toUpperCase() 或 toLowerCase()。
传递参数给函数
按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。

例如(使用 IE 对象模式):

// 本代码段破坏(覆盖)其参数,所以
// 调用代码中反映不出变化。
function Clobber(param)
{
// 破坏参数;在调用代码中
// 看不到。
param = new Object();
param.message = "This will not work";
}

// 本段代码改变参数的属性,
// 在调用代码中可看到属性改变。
function Update(param)
{
// 改变对象的属性;
// 可从调用代码中看到改变。
param.message = "I was changed";
}

// 创建一个对象,并赋给一个属性。
var obj = new Object();
obj.message = "This is the original";

// 调用 Clobber,并输出 obj.message。注意,它没有发生变化。
Clobber(obj);
window.alert(obj.message); // 仍然显示 "This is the original"。

// 调用 Update,并输出 obj.message。注意,它已经被改变了。
Update(obj);
window.alert(obj.message); // 显示 "I was changed"。
检验数据
当按值进行检验时,是比较两个截然不同的项以查看它们是否相等。通常,该比较是逐字节进行的。当按引用进行检验时,是看这两项是否是指向同一个原始项的指针。如果是,则比较结果是相等;如果不是,即使它们每个字节都包含完全一样的值,比较结果也为不相等。

按引用复制和传递字符串能节约内存;但是由于在字符串被创建后不能进行更改,因此可以按值进行比较。这样可以检查两个字符串是否包含相同的内容,即使它们是完全独立产生的。
zhaoweiwei 2003-06-19
  • 打赏
  • 举报
回复
s是局部变量,通过函数后s就失去作用了,你怎么可能在得到他呢?

要是想得到通过函数后的s他必须为全局变量

要不就是有两个s

87,988

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧