如何解释此功能clear()
的行为?
为什么对象a
没有分配空值?
var a = {};
function clear(a) {
a.b = 2;
a = null;
}
clear(a);
console.log(a); // {b: 2}
console.log(a.b); // 2
答案 0 :(得分:1)
将a
传递给函数clear
时,会将引用的副本传递给对象a
。因此,执行a.b = 2;
会在对象b
中设置值a
。
但是正如我在a
函数内部提到的clear
只是引用的副本,因此将其设置为null
只是说clear
函数内部参数a
指向null
。它不会修改原始对象。
答案 1 :(得分:1)
在JavaScript中创建变量时,您不使用对象本身。您正在使用对该对象的引用。可以将变量视为指向对象的符号(在诸如C等其他语言中,这些引用也被称为指针)。
此外,函数内部引用的任何参数都是它们自己的不同引用。因此,在函数内部将这些变量分配给其他变量不会更改(变异)它们引用的对象。
例如:
var someObject = {a: 1, b:2, c:3};
function doSomething(a) {
a = null;
}
doSomething(someObject);
console.log(someObject) // {a: 1, b:2, c:3}
doSomething
函数内部唯一发生的事情是a
被设置为指向null
而不是someObject
。
在您的示例中,您有一个名为a
的全局变量(在函数外部定义的变量)和一个也称为a
的局部函数变量。如果要让函数更改全局a
,则必须从clear
中删除参数,或者更改参数名称,并仍在a
中引用clear
功能,就像这样:
var a = {};
function clear() {
a.b = 2;
a = null;
}
clear();
console.log(a); // null
console.log(a.b); // Uncaught TypeError: Cannot read property 'b' of null
或
var a = {};
function clear(b) {
a.b = 2;
a = null;
}
clear(a); // Note that it does not matter whether you pass a in or not
console.log(a); // null
console.log(a.b); // Uncaught TypeError: Cannot read property 'b' of null