声明: 本文就前两天学习的 javascript 函数, 传参方式进行笔记;
1. 按值传递
当 js 函数的参数是基本数据类型时, 当调用方法时传入的是一个数值; 也就是说 仅仅是把值给了这个方法, 在这个方法中改变, 重新赋值都不会改变方法外边的全局变量;
代码如下:
按值传递
理解: num 变量实际上实在方法 add 中声明的, 只在 add 方法这个作用域内有效, 调用方法时, 只是复制了一份相同的值给了 num, 方法内不管发生什么, 和方法外界没有任何关系; 所以这叫按值传递;
2. 共享传递
当函数的参数是引用数据类型时, 调用方法时, 参数传递方式为共享传递 -- 传递的是实参的地址拷贝; 先看现象:
共享传递
注意: 在方法中添加属性 name 改变了外部变量 person 的属性, but,,, 在方法中重新 new 一个对象, 却没有改变外部变量; 这对理解会造成一个困惑; 一部分人认为它是按值传递的; 那么 obj.name = "Bob" 却能改变外部属性? 还有一部分人认为是按引用传递的, 那么当给它重新赋值时, 引用应该指向新的变量, 但是并没有;
理解: 共享传递实际上传递的是, 外部变量的引用拷贝, 注意是拷贝哦, ok, 如此这样, 你用这个拷贝来的引用去改变外部变量的内部属性, 没问题, 可以成功, but,,, 如果你直接新创建一个对象给它, 并不影响外部变量, 只是将该拷贝来的引用变了, 而且, 方法一调用完毕, 都会当作垃圾回收;
arguments
但是在方法内部, 若使用 argumentts[0] = {name:"kanda" } 这样的字段去改变参数, 结果会发生什么?
事实证明, arguments 和应该使用一个引用, 但是他们不回改变外部变量的引用;
来源: http://www.jianshu.com/p/2dce6a8e35dc