yishuixs 2015-10-04 09:14 采纳率: 100%
浏览 1773

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内存中的对象本身,传递的是该对象的引用,那么,这能理解为按值传递么?

  • 写回答

2条回答 默认 最新

  • devmiao 2015-10-04 15:57
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图