このコードプリントは、変数初期化子で "未定義" 敗北:はtypeofを
この1つは、 "aが定義されていません" というエラーでクラッシュしconsole.log(foo());
function foo() {
return typeof a;
}
:
const a = foo();
function foo() {
return typeof a;
}
がのバグということですV8か期待される行動?
このコードプリントは、変数初期化子で "未定義" 敗北:はtypeofを
この1つは、 "aが定義されていません" というエラーでクラッシュしconsole.log(foo());
function foo() {
return typeof a;
}
:
const a = foo();
function foo() {
return typeof a;
}
がのバグということですV8か期待される行動?
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を、評価の途中でそれにアクセスしようとしています。
素晴らしい、スペックのおかげで!課題の右辺は左辺よりも前に評価されていたと思っていましたが、実際よりも難しいです。 –
見て、お互いを指している円形があります。コールはfoo、fooはaが必要です。だから、どうしたの?
最も簡単な方法は、=記号が最初に右側を実行することです。その結果を=を求められた人に返します。
最初のfooが実行され、その結果はvar a ...に与えられますが、fooが実行されている間はconst aはまだ存在しません。
いいえ、 'typeof'は、変数が存在しない場合にスローしないという意味で特殊です(コンソールに表示する' typeof abc')。したがって、式の右辺が最初に評価された場合、関数は "undefined"を返し、それを 'a'に代入する必要があります。それがスローするという事実は何かが間違っていることを意味します。 –
最初のコードではaが未定義の場合は2番目のコードと同じに定義されていません – Beginner
constをvarに変更しようとしましたが、エラーにはなりません。 – Beginner
はい、 'var'が吊り上げられているので、' let a; a = foo() 'は、どちらもクラッシュしません。私のコードの問題は、 'const a = foo()'は変数を半初期化するような単一の文であるということです。 –