簡體   English   中英

Javascript局部變量生存期

[英]Javascript local variable lifetime

我在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”之外調用render函數時,它應該失敗,對嗎?

我的問題是,如果“ new”關鍵字以某種方式使局部變量即使在函數的主體結束時仍保持不變,則在仍然有引用的情況下使對象保持活動狀態?

我說對了嗎?

盡管變量light在函數中聲明,並且在退出后不再存在。 變量引用的對象通過scene.add(light)被“添加到場景中”,並可能創建對該對象的第二個引用。 函數退出后,第一個參考light將超出范圍並刪除參考,從而將其從scene.add(light)保留。

JavaScript垃圾回收只會在沒有引用的情況下清除對象。

new除了創建對象的新實例外沒有什么特別的。

如果我在函數內部創建“ var light”並為它分配“ new”值,它將創建對象嗎?

是。

因為我在函數“ init”的內部聲明了它,所以它是局部變量。 我了解到javascript中的對象是通過引用傳遞的。

如果您是指“引用”(如C和C ++引用),則不會。 如果您的意思是像Java中那樣,那么可以。 有人稱其為“引用副本”,就像傳遞指向對象的指針一樣。

因此,如果我通過“ scene.add(light);”將其添加到場景中,為什么它仍然起作用? 我通過了引用,然后對象本身應該被銷毀,當我在“ init”之外調用render函數時,它應該失敗,對嗎?

該對象不是在堆棧上創建的,只有指向它的值在堆棧中。 該對象在堆上創建。 由於已將對象傳遞給另一個方法,因此假設該方法將引用存儲在某個地方,則退出此函數時該對象仍將存在。 只有變量(包含“指針”)會超出范圍。

我的問題是,如果“ new”關鍵字以某種方式使局部變量即使在函數的主體結束時仍保持不變,則在仍然有引用的情況下使對象保持活動狀態?

當不再有對象引用時(如Java),該對象將被自動垃圾回收(如C語言中的free )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM