js中函数传递参数,究竟是值传递还是js 函数参数 引用传递递

Js中的值传递/引用传递。概念自梳理
Js中的值传递 &以及
&引用传递!
一年半不写代码的后果就是:自己在看一些具有代表性的代码小片段的时候,竟然在思路上混淆了。而我混淆的地方就是:JS中,值传递、引用传递,两者有什么区别。(注意,js中值传递/引用传递的区别,这一句话,就透露出自己是一个技术菜鸟了,因为这句话本身就是错的)
我先复制出那天自己混淆的代码段(蓝色字体):
var person = new Object();
person.name = "wang"
alert(person.name); //wang
var pName = "zhao"
pName.age = 24;
alert(pName.age); //undefined
function addTen(num){
var count = 20;
var result = addTen(count);
alert(count); //20
alert(result); //30
function setName(obj){
obj.name = "Mr.Li";
var person = new Object();
setName(person);
alert(person.name); //Mr.Li
function setName(obj){
obj.name = "Mr.Li";
obj = new Object();
obj.name = "Tim";
var person = new Object();
setName(person);
alert(person.name); //Mr.Li
谁能给我讲清楚这两个对比知识点?特别是345这几个对比?我现在弄不清楚值传递和信用传递的概念了,在这个几个例子上弄糊涂了。广大开发的朋友们,给猫咪讲讲吧。我都两年不写代码了,这突然再回头看看,竟然啥也看不懂了谁给我讲讲
如果不仔细看,或者跟我一样是个技术菜鸟,那么其实已经被忽悠了。当我找了很多例子,找了很多文章,又对比了代码,并且敲打到htm里验证,我发现其实自己思路已经错了。
===================正文正文/干货干货=================================
我拿这两个例子就能给大家大致说清楚了:
function setName(obj){
&obj.name = "Mr.Li";
var person = new Object();
setName(person);
alert(person.name); //Mr.Li
function setName(obj){
obj.name = "Mr.Li";
obj = new Object();
obj.name = "Tim";
var person = new Object();
setName(person);
alert(person.name); //Mr.Li
测试4,咱们简单分析一下:创建了一个setName()对象(或者方法),并且将其保存在变量person中。然后,这个变量被传递到setName()函数中,就被复制给了obj。在这个函数内部,obj和person引用的是同一个对象。因为person指向的对象在堆内存中只有一个,而且是全局对象,所以在函数内部给obj添加name属性后,函数外部的person也会有所反应。注意注意,这样一来,很多开发人员就误认为参数是按照【引用传递】的。其实这个概念是错的。为什么?那么我们来看测试5
和测试4,基本一样,唯一的区别就是在于,测试5在函数(方法/对象)中添加了两行代码:obj
= new Object();
obj.name = "Tim";第一句为obj重新定义了一个对象。第二句为该对象定义一个带有不同值的name属性。1.person传递给setName()后,其执行setName()方法,其name属性被设置为【Mr.Li】,然后继续执行方法内的代码,即重新给obj(变量)赋予一个新的对象,然后重新给obj的name属性设置为【Tim】
2.那么,我们执行
alert(person.name); //Mr.Li这行代码的时候,应该输出【Tim】才对啊。
3.总结:当函数内部重写obj变量时,变量引用的就是一个局部对象了。而局部对象会在函数执行完毕后,立即销毁。所以,输出结果是【Mr.li】而不是【Tim】
那么,还有几个重要的点需要注意:通过验证和反验证,证明了一个思路:JS中没有引用传递(地址传递),而只有,只有!只有【值传递】!
js中的变量值,有基本类型值(五个),和引用类型值。而传递只有值传递,没有引用传递。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。js中函数的参数传递是值传递还是引用传递?怎么判断参数的类型_百度知道
js中函数的参数传递是值传递还是引用传递?怎么判断参数的类型
我有更好的答案
如果函数声明的参数形式不是引用,则一律传值,默认方式为按位拷贝,包括该对象(实例)内嵌的所有元素
采纳率:90%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。js按值及按引用传递详解
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。 引用传递:(形式参数类型是
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
纠错:第一段尼古拉所谓的对象按值传递的说法并无错处,理由是地址值本身就是一个原始值,它是可以如同值传递一样被覆盖掉的。也即当一个引用类型的实参传进来的时候,它是将这个引用类型的指针所占用的一块内存复制给了形参,形参具有了一块跟实参一模一样的内存,但二者不是一个。当然它俩所指向的堆内存中的对象是一样的。这就是尼古拉所谓的值传递的核心含义。
第二段,引用传递的定义说的就是地址传递。后面一句&person就会自动被修改为指向其name属性值为&Greg&的新对象&,怎么会修改呢?前面插入了新的赋值,一个在堆内存中完全的崭新的区块被创建出来了,自然地址值就发生了改变,obj这个以前的形参变量就被覆盖掉啦!这一步涉及到js中函数内部变量的优先级问题。与引用不引用没什么关系。函数内部修改了参数的值,原始的引用仍然不变,这个说法有问题,obj.name = &Nicholas&,这本身就是在函数内部对堆内存对象的修改,怎么说原始的引用不变呢,明明变了好不好?后面的说法比较正确。不过局部对象一说有些问题,在js中只有局部变量一说,何来局部对象?当然你说变量是对象类型啊,所以称他为局部对象也解释的过去。不过终究这样说容易造成误导。当然要访问这个对象,的确只能通过该函数入口。
第三、四段:前面已阐述清楚,不赘述。
第五段,&这个例子中person对象不是当做参数传递的,但person.name的值还是&Nicholas&,这和person当做参数传递的情况是一样的。可以确定的是:这个例子中对象是按引用传递的。但按照尼古拉的说法这个例子中对象也是按值传递的。 那么可以得出结论:尼古拉的说法是错的。我们可用图来说明一下这个问题。&说白了跟前面所描述的没什么区别,只不过将像形参变量传递地址值改成了向一个普通变量传地址值而已。其他并无差别。
几幅图的解读正确。但上述描述有些混乱,如果纯粹一个初学者,基本无法看明白,而且还有误导。
第六段的解释很混淆,不能这么理解,堆内存中的那么对象你称之为Object,这很容易跟构造函数Object混淆,另外这个Object也容易造成person,obj跟Object混淆。你可以这么说,那个堆内存中的匿名对象,它在堆内存中的地址值分别放在了person跟obj当中。你任意操纵其中一个,实际本质上都是在操纵堆内存中的那个匿名对象。后面的解读跟我上面说的差不多,不赘述。
在这里我们要理清一个问题。
function setName(obj) {
obj.name = &Nicholas&;
obj = new Object();
obj.name = &Greg&;
var person = new Object();
setName(person);
alert(person.name); // &Nicholas&
按常规来说,如果obj后面的赋值没有用var的话,它会泄露到全局环境中去,而实际情况是你无法在全局中访问到obj。为什么呢?原因是在函数内部obj在预编译阶段并非没有声明,他作为一个形参变量已经被声明了,也就是说在栈内存中有那么一块叫obj的内存块存在。此时赋值就不会再声明一次,直接覆盖那个变量里的值就好了。当然你说相当于var重新声明了一个变量也可以,相当于在预编译阶段obj先作为形参声明,然后作为普通变量声明,但是因为优先级的问题,它的声明被忽略掉了,意思就是还是形参声明的那一次,var或者不var一点影响没有,还多出来一个关键字,必要性不大。
好了,关于本文解析非常清晰了。
1,.按值传递,分为两类,基本类型值的传递和函数参数的传递,而函数参数的传递又有两种,基本类型值的参数传递和引用类型值的参数传递。其中,引用类型值的传递实际上传递的是对象的引用(引用=内存中的地址=值),因为执行的操作是复制保存操作(这一点可以看js高级教程68页的下面的注释),而不是传递的对象本身。
2.按引用传递则很好理解,传递的是完整的对象本身。
这个对于按值及按引用传递的解释才叫真正清楚了。按值传递实际是基本类型值跟引用类型值(就是地址值)两种。
引用类型值的传递和引用传递,一字之差,含义却相差千里。引用类型值传递传递的是一个地址值,而引用传递传递的是对象本身。也就相当于堆内存中一块分配了空间的对象,它有两个名字,你对其中一个赋值,就是对另一个赋值,自然两个都被修改,且原先的对象被覆盖了。这跟引用值传递完全不一样,引用值传递覆盖的只是地址值而已,堆内存的原对象内存块一点不受影响。&(本文"js按值及按引用传递详解"的责任编辑:SEO学堂)
------分隔线----------------------------
2011年8月,张小龙曾经在饭否上写过一句:要提防那些 Blog 写得好的产品经理,因为在 ...
这个并不是我的一个判断,之前有一次在哪里看到的一个研究报告了,忘记出处了。 不过...
关于SEO的未来,很多人很悲观。以至于Zac得经常写写些文章给国内的SEO行业打打气。Zac...
作为一个年近50的SEO人,我也经常会考虑,SEO到底能做多久?我已经转换过职业,年轻时...
很多时候,我们很强调原创内容但并不等于网站就一定要原创内容,SEO就一定要原创内容...
无论你是否亲自买过大白菜,但是你一定可以知道或想象出在菜市场买大白菜的场景:面对...
整合资源这个名词已经流行了很久了,但是市面上号称从事资源整合工作的人还是大部分都...
前几天,相信大家在各种的新闻App上看到过一篇新闻黑百度搜索排名 计算机硕士两年赚70...
今天给大家写一个SEO非常重要的优化方法技巧,就是通过多用描述的方法来优化网站的一...
前几天看到Barry Schwartz的一篇帖子,记录了SEO人员和Google内部人员关于子域名和子...232被浏览26,000分享邀请回答187 条评论分享收藏感谢收起

我要回帖

更多关于 js回调函数带参数传递 的文章

 

随机推荐