JavaScript的函数参数传递分为按值传递、按引用传递以及按共享传递。
按值传递
什么是按值传递?
把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
var value = 1
function foo(o) {
o =2
console.log(o)
}
foo(value)
console.log(value) // 1
当传递value到函数foo中的时候,相当于拷贝了一份value,假设拷贝的这份叫做_value,函数中修改的都是_value的值,而不会影响原来的value值。
引用传递
引用传递就是传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象。
var obj = {
value: 1
}
function foo(o) {
o.value = 2
}
foo(obj)
console.log(obj.value) // 2
按共享传递
什么是按共享传递?再看个例子
var obj = {
value: 1
}
function foo(o) {
o = 2
}
foo(obj)
console.log(obj.value) // 1
共享传递是指在传递对象的时候,传递对象引用的副本。
注意:按引用传递是传递对象的引用,而按共享传递是传递对象的引用的副本。
所有如果修改o.value可以通过引用找到原值,但是直接修改o,并不会修改原值。所以第二、第三个例子其实都是按共享传递。
网友评论