《javascript高级程序设计》4.1.3:所有函数的参数都是按值传递的
就是说把函数外部的值赋值给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
按值传递(基本类型)
var value = 1;
function foo(v) {
v = 2;
console.log(v); //2
}
foo(value);
console.log(value) // 1
可以理解为,给函数的型参赋值(函数型参此时已声明但为赋值),由于基本类型的值是存储在栈内存中(stack)。将变量value的值传递给型参v,但value自己的值不改变。
按值传递(引用类型)
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2
变量obj被声明在栈内存中,存着引用类型在堆内存(heap)中的地址,将引用类型的地址传递给型参o。函数foo可以通过这个地址访问到堆内存中的引用类型,并进行修改。
var obj = {
value: 1
};
function foo(o) {
o = 2;
console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1
obj存在栈内存中的地址被传递给型参o,型参后被赋值o=2,就和obj没有任何关系了。
总结:
重的来说,JavaScript中所有函数都是按值传参,只是分为传递的是
- 基本类型的值
- 引用类型的引用地址
网友评论