对象-JS里,如何理解函数的传参都是按值传递的?

问题描述

JS里,如何理解函数的传参都是按值传递的?

《JavaScript高级程序设计》里讲到函数按值传递时,特意提了“在局部作用域中修改的对象会在全局作用域中反映出来,说明参数是按引用传递的”这个说法是错误的,随即Nicholas也给出了一个例子:

 function setName(obj){
     obj.name = 'Nicholas';
     obj = new Object();
     obj.name = 'Greg';
 }

 var person = new Object();
 setName(person);
 alert(person.name);    //returns 'Nicholas'

Nicholas本人也说了,“实际上,当在函数内部重写obj时,这个变量引用的就是局部变量了,而这个局部变量会在函数执行完毕后立即被销毁”,那么:
1、经过重写的obj,可否理解为已经不是person对象?或者说,obj这个函数的局部变量装的东西已经换了,不再是实参person传来的对象引用,而是一个函数内部的、一个新的匿名对象的引用?若如此,那么“在局部作用域中修改的对象会在全局作用域中反映出来,说明参数是按引用传递的”这种说法就应该是正确的啊,因为的确是按引用传递的,Nicholas举的例子本质上并没有证明这个说法是错误的。
2、ECMAScript规定参数都是按值传递的,那么传递一个对象时,难道传递的方式不是按引用传递?可以肯定的是,传递的不是存储在stack内存中的对象本身,传递的是该对象的引用,那么,这能理解为按值传递么?

解决方案

简单来说,就是你修改函数里面的参数,不会影响调用者中的那个变量。注意这个修改对于对象来说是指向新的 变量,不是修改对象的属性。

解决方案二:

“=",是对 对象进行赋值,之后就表示新赋值的对象(or值),和传入的不是同一个东西。后续引用的也是后赋值的对象
这个实际和java类似,也是简单的数据对象就可以完全看成值传递,复杂的数据对象就是引用,在局部函数中操作传入对象的属性,都是引用传递;
如果对传入对象本身赋值,则属于局部对象赋值,这个时候和传入的参数已经没有关系了。

时间: 2024-10-20 07:31:54

对象-JS里,如何理解函数的传参都是按值传递的?的相关文章

jsp-我不懂这个js里的eval函数到底在哪里用到了

问题描述 我不懂这个js里的eval函数到底在哪里用到了 详细的代码如下var navigator_appName = ""chrome"";var window;var dbits;var canary=0xdeadbeefcafe;var j_lm=((canary&0xffffff)==0xefcafe);function BigInteger(abc){if(a!=null)if(""number""==typ

javascript setTimeout函数可以传参/传值

 window.setTimeout 方法是用来延迟执行某段函数(方法)的.但它在调用指定的方法并传参时寸在一定缺陷.一般直接传参,只能传入字符传之类的参数,但对于Object类型的就无法直接传入,我的方法就是重写window.setTimeout方法,利用apply回掉,  代码如下 复制代码 var _st = window.setTimeout; //fRef 是test函数,mDelay是时间 window.setTimeout = function(fRef, mDelay) {   

JavaScript中setTimeout和setInterval函数的传参及调用_基础知识

如何向 setTimeout . setInterval 传递参数看如下代码: var str = 'aaa'; var num = 2; function auto(num){ alert(num); } setTimeout('auto(num)',4000); 这样写是可以正常工作的,但是如其说这是参数传递,还不如说是直接使用的全局变量.所以,这种写法是没有必要的,一般情况下更多的是用到传递局部变量作为参数. 把代码修改一下: //var str = 'aaa'; var num = 2;

js中关于new Object时传参的一些细节分析_javascript技巧

1, 参数是一个对象,核心js对象(native ECMAScript object)或宿主对象(host object),那么将直接返回该对象. 其生成的对象构造器仍然是所传参数对象的构造器.这样造成的后果是虽然该对象是new Object,但其constructor不一定是Object. 复制代码 代码如下: function Person(){this.name='jack';} var w = new Object(window), d = new Object(document), p

查找iframe里元素的方法可传参_jquery

复制代码 代码如下: //查找iframe里面的元素 function FindObject(ss) { var o = null; o = $(window.frames["main"].document).find("#" + ss); return o; }

后台调用插件弹出框-C后台.cs如何调用插件zDialog.js里的弹出框的函数?

问题描述 C后台.cs如何调用插件zDialog.js里的弹出框的函数? 调用zDialog.js里Dialog.alert();函数 protected void Alert(string message) { var ScriptText = string.Format(""<script type=""text/javascript"">Dialog.alert(""{0}"");<

对Python和Go的函数传参研究

传参一直是语言中有点纠结的东西.一提到这个,总会有人说,需要区分传值,传递引用,还有传递指针什么的.而且,貌似不同的语言对此也有不同的实现. 我自己也对这个有点搞混了,所以需要实验一下. 写在开头: 我常用的几个语言是,C++,Go语言,python这几种.三个语言中,只有C++有引用,而Python是没有指针的.参数传递主要就两类,传值和传递引用. 本文只写Python和Go语言,C++太复杂了,需要专门研究. 试验的主要分为几种类型,分别为: 单一的变量类型,比如int,float这种基本类

委托/事件/线程传参简单理解

写了很多代码,但几乎都没写过委托/事件/线程传参方面应用的代码 因此自己总很容易理解后又遗忘 今天又重温了一下 因此以最简单的方式的代码方式写下来帮助理解 1.线程传参[简单几行代码]    1 static void Main(string[] args) 2         { 3             if (ThreadPool.QueueUserWorkItem(new WaitCallback(Program.WritePara), "这是传进去的参数")) 4     

PHP闭包函数传参及使用外部变量的方法_php技巧

本文实例讲述了PHP闭包函数传参及使用外部变量的方法.分享给大家供大家参考,具体如下: 在Laravel控制器写两个方法,一个是在内部创建一个闭包函数,一个是执行传过来的闭包函数,测试闭包的写法,use使用外部变量,及闭包函数的传参.如下: //测试闭包传参及use使用外部变量 public function testClosure($t1, $t2) { $closure = function ($param1, $param2) use ($t1, $t2) { echo $param1.$