javascript中函数的传参方式是比较奇葩的;
javascript并没有按引用传递参数的方式,不严格的说全部为按值传递,但是对于引用类型来说,个人觉得这个像是共享传递
基本类型作为参数传入函数(只是将值复制给函数内部的一个局部变量)
var a = 10;
function foo(a) {
a = 20;
return a;
}
console.log(foo(a)); // 20
console.log(a); // 10
对于基本类型只是简单的将值赋给函数内部的一个局部变量,所以在局部作用域中修改的值并不会在全局变量中反映出来,说到这里我们在看引用类型,很多人会对下一代码产生误解
var obj = {
name: "zp"
};
function foo(obj) {
obj.name = "zpy";
return obj;
}
foo(obj);
console.log(obj.name); // "zpy"
很多人认为这个例子不就是局部作用域中修改的值并且在全局变量中反映出来(从而得到说js中有按引用传递的结论),但是事实上并不是这样,在javascript中对象名也可以理解为一个指针,在讲引用类型作为参传入函数时,同时会将地址同时复制给函数内部的局部变量,这样也就是说,此时函数的局部变量与全局变量obj指向堆内存中的同一个对象,
看下面的一段代码就可以说明出,js中并没有按引用传递
var obj = {
name: "zp"
};
function foo(obj) {
obj = new Object();
obj.name = "zpy";
return obj;
}
foo(obj);
console.log(obj.name); // "zp"
obj = new Object()这句话讲局部变量中的地址名给更改,局部变量在函数执行完后就会被销毁,所以可以印证js中并没有按引用传递
本文出自 “zp1996” 博客,请务必保留此出处http://9865481.blog.51cto.com/9855481/1687693
原文地址:http://9865481.blog.51cto.com/9855481/1687693