【发布时间】:2018-12-14 06:39:12
【问题描述】:
我精通 C、C++,但不熟悉 Javascript。我正在学习three.js,但我无法理解这里发生了什么:
var camera, scene, renderer, control;
init();
function init() {
scene = new THREE.Scene();
var light = new THREE.DirectionalLight( 0xffffff, 2 );
light.position.set( 1, 1, 1 );
scene.add( light );
}
这是我想问的简化版本。我已经阅读了很多文档和论坛,但我在任何地方都找不到。
如果我在函数内部创建“var light”并用“new”为其赋值,它将正确创建对象。由于我在函数“init”的内部声明它是局部变量。我了解到 javascript 中的对象是通过引用传递的。所以如果我通过“scene.add(light);”将它添加到场景中,为什么它仍然有效?我传递了引用,然后对象本身应该被销毁,当我在“init”之外调用渲染函数时,它应该会失败吗?
我的问题是,如果“new”关键字以某种方式使局部变量即使在函数的主体结束时仍然存在,那么在仍然存在对它的引用的情况下保持对象的活动?
我做对了吗?
【问题讨论】:
-
对象只有在不再引用它们时才会被销毁。这就是垃圾收集的工作原理。 (您可以将其与 C++ 中的
std::shared_ptr进行比较) -
new并不重要。scene.add()可能保留对light的引用。 -
如果函数一结束变量就被清除掉,那我们就麻烦了。 :)
标签: javascript three.js var