在JavaScript函数中是否通过引用返回除Boolean和Numbers之外的对象?
如果这些对象在它们所属的函数终止时被销毁,这怎么可能呢?
答案 0 :(得分:18)
在对它们的所有引用都消失并收集垃圾之前,对象不会被销毁。返回对象时,调用代码获得对它的引用,并且不会对对象进行垃圾回收。
从技术上讲,被调用函数的堆栈帧在返回时会被销毁。但是,该对象不在堆栈上,而是在堆上。函数对该对象的本地引用位于堆栈上,因此被销毁,但调用代码的引用在一段时间后才会被销毁。
作为旁注,返回它的方式并不重要,因为函数返回后无法使用该对象。
答案 1 :(得分:8)
在JavaScript函数中是否通过引用返回除Boolean和Numbers之外的对象?
确实,JavaScript中的对象始终通过引用传递
如果这些对象在属于的函数终止时被破坏了怎么可能?
仅销毁引用,而不是值本身。只要没有引用,该对象就是垃圾收集的候选对象。
答案 2 :(得分:6)
那里有两个很棒的答案,但我想我应该补充说,它很容易测试:
function modify(arg) {
arg.modified = true;
}
test = 4;
modify(test);
console.log(test.modified); // undefined
test = {};
modify(test);
console.log(test.modified); // true
test = "";
modify(test);
console.log(test.modified); // undefined
其中undefined表示已复制而不是通过引用传递。请注意,字符串不会通过引用传递。
答案 3 :(得分:1)
参数(包括对象)按值发送到函数。参数对象的属性可用且可更改,其行为类似于引用。请看下面的例子:
function changeObj(obj){obj.a *= 10; return true;}
function killObj(obj){obj = null; return true;}
function changeAndKillObj(obj){obj.a += 1; obj = null; return true;}
var a = {a:1, b:'test'};
console.log(a); //Object {a:1, b:'test'}
changeObj(a);
console.log(a); //Object {a:10, b:'test'}
killObj(a);
console.log(a); //Object {a:10, b:'test'}
changeAndKillObj(a); //Object {a:11, b:'test'}
底线:您可以使用对象的属性执行任何操作,但不能使用对象本身执行任何操作。对参数的任何赋值都会使它成为不同的对象并从初始对象中取消链接。