JavaScript中参数之“共享传递”、“按值传递”、“按引用传递”

来源:互联网 发布:麦课在线网络通识学院 编辑:程序博客网 时间:2024/06/03 11:57

定义

在《JavaScript高级程序设计》第三版4.1.3,讲到传递参数:

ECMAScript中所有函数的参数都是按值传递的。
什么是按值传递呢?

也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

按值传递

在像参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数)

var value = 1;function foo(v) {    v = 2;    console.log(v); //2}foo(value);console.log(value) // 1

很好理解,当传递value到函数foo中,相当于拷贝了一份value,假设拷贝的这份叫_value,函数中修改的都是_value的值,而不会影响原来的value值。


引用传递

在像参数传递引用类型的值时,会把这个值得内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
(即按引用传递,就是传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象。)

var obj = {    value: 1};function foo(o) {    o.value = 2;    console.log(o.value); //2}foo(obj);console.log(obj.value) // 2

看,这就是引用传递,o的变化反映到了obj这个对象上

共享传递

我的理解是,参数是引用类型的值,并直接把这个参数进行赋值操作,这样就实现了共享传递,这个改变不会反应到函数外部。

var obj = {    value: 1};function foo(o) {    o = 2;    console.log(o); //2}foo(obj);console.log(obj.value) // 1
var obj = {    value: 1};function foo(o) {    o = {        value:3    };}foo(obj);console.log(obj.value) // 1

看,这就是共享传递,改变引用参数的值不会影响到外部。

传值还是传引用或共享

function changeStuff(num, obj1, obj2){    num = num * 10;    obj1.item = "changed";    obj2 = {item: "changed"};}var num = 10;var obj1 = {item: "unchanged"};var obj2 = {item: "unchanged"};changeStuff(num, obj1, obj2);console.log(num);   // 10console.log(obj1.item);    // changedconsole.log(obj2.item);    // unchanged
阅读全文
0 0
原创粉丝点击