2017-09-02 54 views
0

我從MDN瞭解到,'未定義'被識別爲原始值,ES doco也證實「未定義值」是「原始值,當變量未被賦值」 。'undefined' - 如果它被定義爲一個原始值,它在內存級別的值是什麼定義的?

我也明白,即使可變可以不被分配的值(即,未初始化變量),內存仍然創建其執行上下文的(「建立」相)期間分配爲它在執行之前發生。這就解釋了爲什麼當我們試圖訪問這個變量時,我們沒有得到一個引用錯誤 - 相反我們只是遇到了'undefined'(即在控制檯日誌中)。

注意到上述情況,我的問題是,在內存中,這在變量的內存位置看起來如何?在未定義變量的已分配內存位置/地址處實際上是否有是在內存地址的值(什麼都沒有)?如果是這樣,那麼我們可以將該值描述爲null(0x00)?

謝謝。

回答

1

即使變量未被賦值(即未初始化的變量),我也會理解,在執行發生前創建其執行上下文('創建'階段)期間仍然爲其分配內存。這就解釋了爲什麼當我們試圖訪問這個變量時,我們沒有得到一個引用錯誤 - 相反我們只是遇到了'undefined'。

不是。未初始化的變量與用undefined值初始化的變量有所不同。看看this answer explaining the initialisation for various kinds of declarations

這在變量的內存位置看起來像什麼?

這是如何實現並不重要。每個實現可能會做不同,重要的是JS中的可觀察效果。

實際上在變量的分配的內存位置/地址處有一個值,還是在內存地址空的值?

分配的內存始終保持一定的值。不過,這可能是JS中沒有表示的值。

+0

有趣,謝謝。然而,你的第一條評論以及到那個線程的鏈接,當你在作用域頂部創建綁定時,你會談到如何將var聲明初始化爲undefined。這不正是我在這裏所說的,我不明白你的觀點:「一個未初始化的變量與用undefined值初始化的變量有什麼不同? var greet; console.log(greet); // undefined var hello = undefined; console.log(hello); // undefined console.log(greet == hello); // true console.log(greet === hello); // true 他們對我來說似乎是平等的(而不是'不同')? – 151SoBad

+0

@ 151SoBad嘗試用'console。日誌(迎接);讓我們打招呼;' - *那*沒有初始化。一個'var'總是以範圍頂部的undefined值初始化。 – Bergi

+0

有道理 - 我還沒有抓住使用'讓' - 仍然非常香草的Javascript。我需要問的最後一件事是,有人在你的帖子中評論說:「對於函數聲明,它們在執行開始之前被賦值」,這是一直困擾着我的概念。上一次我看看ES規範時,我認爲函數聲明僅在執行期間被分配了一個值?爲「聲明綁定實例化」期間發生的函數聲明(逐字從ES6規範)分配一個值?這在執行過程中發生了嗎? – 151SoBad

相關問題