2016-09-14 5 views
1

このコードプリントは、変数初期化子で "未定義" 敗北:はtypeofを

この1つは、 "aが定義されていません" というエラーでクラッシュし
console.log(foo()); 

function foo() { 
    return typeof a; 
} 

const a = foo(); 

function foo() { 
    return typeof a; 
} 

がのバグということですV8か期待される行動?

+0

constをvarに変更しようとしましたが、エラーにはなりません。 – Beginner

+0

はい、 'var'が吊り上げられているので、' let a; a = foo() 'は、どちらもクラッシュしません。私のコードの問題は、 'const a = foo()'は変数を半初期化するような単一の文であるということです。 –

答えて

5

The variables are created when their containing Lexical Environment is instantiated but may not be accessed in any way until the variable’s LexicalBinding is evaluated.

the specからあなたは禁止されているLexicalBindingを、評価の途中でそれにアクセスしようとしています。

+0

素晴らしい、スペックのおかげで!課題の右辺は左辺よりも前に評価されていたと思っていましたが、実際よりも難しいです。 –

0

見て、お互いを指している円形があります。コールはfoo、fooはaが必要です。だから、どうしたの?

最も簡単な方法は、=記号が最初に右側を実行することです。その結果を=を求められた人に返します。

最初のfooが実行され、その結果はvar a ...に与えられますが、fooが実行されている間はconst aはまだ存在しません。

+1

いいえ、 'typeof'は、変数が存在しない場合にスローしないという意味で特殊です(コンソールに表示する' typeof abc')。したがって、式の右辺が最初に評価された場合、関数は "undefined"を返し、それを 'a'に代入する必要があります。それがスローするという事実は何かが間違っていることを意味します。 –

+0

最初のコードではaが未定義の場合は2番目のコードと同じに定義されていません – Beginner

関連する問題