js函数传递参数(Javascrpt 高级程序设计书中原题)详解

书上有个例子:

  1. function setName(obj) {
  2. obj.name = 'Nicholas';
  3. obj = new Object();
  4. obj.name = "Greg";
  5. console.log(obj.name); // "Greg"
  6. }
  7. var person = new Object();
  8. setName(person);
  9. alert(person.name) // "Nicholas"

另外不传递参数改成: 

  1. function setName() {
  2.   person.name = 'Nicholas';
  3.   person = new Object();
  4.   person.name = "Greg";
  5.   console.log(person.name); // "Greg"
  6. }
  7. var person = new Object();
  8. setName();
  9. console.log(person.name) // "Greg"

分析一下原因:

第一个case:

  person这个object作为参数传递给function的时候,function内部的作用域可以找到person而且这个时候obj的值是一个指向的是“堆内存空间中person所指向的这个Object它本身”(person本身也是个指针,obj是person这个指针被作为参数传递后复制出来的副本);然后下一步new出一个Object的时候,是在堆内存空间中新建了一个Object(),这个时候obj是指向这个新new出来的Object的指针,所以对这个Object新增一个叫name的属性并且在这个局部变量指针还未被销毁(即函数未执行完毕)之前打出log,输出的是这个新new出来的Object里的name属性,是Greg。需要注意的是,在function执行的这一个阶段里,对于原来的Object进行操作只有一次,即给它的name属性赋值为'Nicholas',随即在这个函数里就没有指针再指向它了,所以在外部的输出就是"Nicholas";

第二个case:

  从始至终person伴随着我们的一直是person这个指针, 最初在声明阶段即在function外部那个 var person = new Object(); 时,这一步它是指向new出来位于堆内存内的Object。但在之后function中的执行阶段, person指针又被指向function里new出的这个Object了,注意这次不是局部变量,所以person就一直指向新的Object()了,所以后边的log输出就是这个新new出来的对象的name: "Greg" 。


所以第一个case里我想要让两个new出的Object里的name都输出出来,就可以建立一个全局变量,然后把指针的值存储区来,如下:

  1. <span style= "font-size:14px;"> function setName(obj) {
  2. obj.name = 'Nicholas';
  3. obj = new Object();
  4. obj.name = "Greg";
  5. pointer = obj;
  6. }
  7. var person = new Object();
  8. var pointer = null;
  9. setName(person);
  10. alert(pointer.name); // "Greg"
  11. alert(person.name); // "Nicholas"</span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值