2017-12-04 2 views
0

以下のスニペットで何が起こっているのか分かりません。JavaScriptの一時的なデッドゾーン

一時的なデッドゾーンのためにエラーが発生すると思われますが、const baz = '123123';が吊り上げられたようです。

なぜすべてが機能するのですか?

class Foo { 
 
    constructor() { 
 
    console.log('Foo baz is:', baz) 
 
    } 
 
} 
 

 
function log() { 
 
    console.log('log baz is:', baz); 
 
} 
 

 
const baz = '123123'; 
 

 
log(); 
 
new Foo();

+2

*一時的な*デッドゾーンではなく、構文的なデッドゾーンではないので、初期化した後に(関数呼び出しで)変数にアクセスするだけで問題ありません。関数を先に呼び出すと、そのスコープ内の同じ「吊り上げられた」変数にアクセスしていましたが、例外がスローされました。 – Bergi

答えて

0

const宣言はありません(ソートの)掲げ、ので、あなたのコードは次のように見えたかのようにそれはです:

const baz; // hoisted, sort-of 
class Foo { 
    constructor() { 
    console.log('Foo baz is:', baz) 
    } 
} 

function log() { 
    console.log('log baz is:', baz); 
} 

baz = '123123'; // not really possible because it's const 

log(); 
new Foo(); 

のでデッドゾーンがありますが、実際には何もはデッドゾーン内でが発生します。 の後に関数呼び出しを作成しないでください。のデッドゾーンの後であれば、それはすべて役に立ちます。デッドゾーン内のシンボルは、ネストした関数のコンテキストで言及してもかまいません。デッドゾーンは、実際に宣言される地点の前に吊り下げられたシンボルに積極的に「触れる」ことに関するものです。

は実際には、理由は「一時的なデッドゾーン」のコンセプトの、それはvar宣言されている方法を「掲揚」されているようconstlet宣言を考えて本当に意味がないのです。この特定の例は、ネストされたレキシカルコンテキストの参照が実際に機能するため、宣言がどのように吊り上げられるように見えるかを示しています。シンボルは、それらの関数のコードが実際に実行される時間によって定義されるためです。

+0

これについての情報はどこにありますか?何らかの情報源を含めることができますか? – Hitmands

+1

MDNのドキュメントにはいくつかの情報があります。 – Pointy

2

吊り上げる必要はありません。

と呼ばれるになるまで、関数は変数にアクセスしようとしません。

定数が定義され、値が割り当てられるまで、それらを呼び出さないでください。