14

JavaScript 函数是否通过引用返回布尔值和数字以外的对象?

当这些对象在它们所属的函数终止时被销毁时,这怎么可能呢?

4

4 回答 4

20

直到所有对它们的引用都消失并收集垃圾后,对象才会被销毁。当对象被返回时,调用代码获得对它的引用,并且对象不会被垃圾回收。

从技术上讲,被调用函数的堆栈帧在返回时被销毁。但是,对象不在堆栈上,而是在堆上。函数对对象的本地引用在堆栈上,因此被销毁,但调用代码的引用直到一段时间后才被销毁。

作为旁注,它如何返回并不重要,因为函数在返回后无论如何都不能使用该对象。

于 2012-06-08T23:05:06.367 回答
8

JavaScript 函数是否通过引用返回布尔值和数字以外的对象?

确实,JavaScript 中的对象总是通过引用传递

当那些对象所属的函数终止时这些对象被销毁时,怎么可能呢?

只有引用被破坏,而不是值本身。并且只要没有剩下的引用,该对象就是垃圾收集的候选对象。

于 2012-06-08T23:05:08.127 回答
7

那里有两个很好的答案,但只是想我应该补充一点,它很容易测试:

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 表示它已被复制而不是通过引用传递。请注意,字符串也不是通过引用传递的。

于 2012-06-08T23:18:06.687 回答
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'}

底线:你可以对对象的属性做任何你想做的事情,但不能对对象本身做任何事情。对参数的任何赋值都使其成为不同的对象并与初始对象取消链接。

于 2016-05-18T19:03:22.610 回答