社区
JavaScript
帖子详情
JS中的参数传递竟然都是传值的?怎么能这样?!!
zouwork
2003-06-19 02:06:25
s=""
function(s)
{
//change s
retrun boolean
}
alert(s);
用返回值是不行了,已经其他用了,S也不能是全局的,(否则function(s)怎么独立出来)
那我怎么知道通过函数后的s?给个不要太复杂的办法~~吧~~
...全文
841
14
打赏
收藏
JS中的参数传递竟然都是传值的?怎么能这样?!!
s="" function(s) { //change s retrun boolean } alert(s); 用返回值是不行了,已经其他用了,S也不能是全局的,(否则function(s)怎么独立出来) 那我怎么知道通过函数后的s?给个不要太复杂的办法~~吧~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
window.location.href跳转页面并
传值
及接收值
博客介绍了通过在URL上使用?拼接值进行
传值
的方法,包括单
参数传递
和多
参数传递
,同时提及了接收值相关内容,属于前端开发
中
URL
传值
的信息技术知识。
React 组件之间
参数传递
,正传props,逆传,同级
传值
,跨组件
传值
context
本文详细介绍了React
中
四种常见的组件间
传值
方式:正向props
传值
、逆向回调
传值
、同级组件间的pubsub-
js
传值
及跨组件context
传值
的方法与应用场景。
Vue.
js
路由功能以及动态路由下的url
传值
和get
传值
本文详述Vue.
js
中
路由功能的配置与使用,包括默认路由、路由跳转及动态路由的URL与GET
传值
。通过实例演示,从安装vue-router到在项目
中
配置与使用路由,再到动态路由
参数传递
的实现。
vue——三种常见的
传值
方式,子传父、父传子、同级
传值
博客主要介绍了Vue组件间的
传值
方式,包括父组件向子组件
传值
、子组件向父组件
传值
(使用$emit
传值
,v-on接受,v-on可用@简写),还提及子组件传输多个参数的情况,以及同级组件
传值
时公共bus.
js
的使用。
JavaScript函数的
参数传递
方式有哪些?
JavaScript函数
参数传递
包括
传值
和传引用两种方式。
传值
不会改变原变量,而传引用则会。此外,arguments对象允许访问所有参数,无论是否声明。选择合适的
参数传递
方式对保证函数行为和灵活性至关重要。,
JavaScript
87,988
社区成员
224,683
社区内容
发帖
与我相关
我的任务
JavaScript
Web 开发 JavaScript
复制链接
扫一扫
分享
社区描述
Web 开发 JavaScript
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章