Deep BlueVBScriptWMIPHPC语言JavaScriptWindows API路由器Windows函数Python | JavaScript函数参数,传值还是传址?首先,十万以及万分肯定的说一句, JavaScript 函数传递参数时,是值传递。虽然您可能不信,因为 ECMAScript 变量可能包含两种不同数据类型的值:基本数据类型,和引用数据类型。难道引用数据类型传递的时候难道也是值传递吗?答,没错。
引用类型的值是什么东西?
var user = new Object(); var admin = user; admin.name = "xiaoxiaozi"; alert(user.name); //返回 xiaoxiaozi 该过程其实是这样的(引用型变量的复制): 所以说,引用类型的值实际上是对其引用对象的一个指针。 函数参数的传递 基本类型我们不做讨论,那玩意除了值还真没别的。咱们继续来说引用类型。请看下面示例: function setName(obj){ obj.name = "xiaoxiaozi"; } var person = new Object(); setName(person); alert(person.name); // 返回 xiaoxiaozi 在向参数传递引用类型值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
因此在调用函数setName()时,person 被复制给了 obj ,因此在函数内部 obj 与 person 引用的是同一个对象,或者说是对同一个对象的引用。所以在给 obj 引用对象加上 name 属性时,person 引用的对象也有了 name 属性,因为虽然 obj 与 person 不同,但是二者引用的对象是同一个。 但是,千万不要认为,在局部作用域中修改的对象会在全局作用域中反映出来就说参数是按引用传递的。为了证明是值传递,让我们再来看如下例子: function setName(obj){ obj.name = "xiaoxiaozi"; obj = new Object(); obj.name = "admin"; } var person = new Object(); setName(person); alert(person.name); // 结果依旧是 xiaoxiaozi 在调用 setName() 函数初时,obj 与 person 引用的是同一对象,所以首次的 name 属性赋值会对 person 有所影响。但是当 obj 被重新定义时,其引用的对象已经与 person 不同,所以后面设置的 name 属性,不会对 person 引用的对象有任何影响。 感觉上面的这个例子非常好,大家可以仔细体会一下,我也是看到了这个例子才决定从文中摘抄(貌似没有摘,就是抄)的。 原文链接:JavaScript 传递参数是值传递?还是值传递啊? |