JS函数参数的传递 Better



ECMAScript 中所有函数的参数都是按值传递的。

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



代码验证


向参数传递基本类型

function addTen(num) { 
    num += 10; 
}
var count = 20; 
addTen(count); 
alert(count); //20,没有变化; 如果是按引用传递的会变成 30

向参数传递引用类型

function setName(obj) { 
    obj.name = "Nicholas"; 
    obj = new Object(); // **重点:如果按引用传递,外部参数会被重新赋值。
    obj.name = "Greg"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name); //"Nicholas" ; 如果是按引用传递的会变成 "Greg"

代码解读:

  1. 外部变量person对象的地址值,复制给内部参数obj (值传递),而不是“直接引用该地址值”(引用传递)
  2. 修改 obj.name = "Nicholas" // 因为obj复制了person的地址,所以person.name变成了"Nicholas"
  3. obj = new Object(); // 内部参数 obj 重新赋值,指向新的对象。
  4. obj.name = "Greg"; // 因为内部参数 obj 不再指向person的地址,所以person.name任然为"Nicholas"


总结

简单地说(个人理解),

按值传递参数就是,在函数内部,新建一个变量,复制传入的参数。

按引用传递就是,函数内部的形参,直接引用这个实参。对形参的任何修改,就是直接在这个实参上的修改。



参考

《JavaScript高级程序设计》.第3版 4.1.3 传递参数

原文地址:https://www.cnblogs.com/huangtq/p/15544599.html