いわゆるjavascriptプロモーション
宣伝する
jsエンジンとコンパイラ
変数と関数を改善する方法、jsコードのコンパイル段階。
jsには、次のようなより古典的な問題があります。
a = 10;
console.log(a);
var a;
または
a = 10;
var a;
console.log(a);
彼は何を出力すると思いますか?未定義?ReferenceError?いいえ、いいえ、彼は10を表示します!なぜ私は後で言うでしょう。次の例を見てください。
console.log(a);
var a = 10;
これは何を示しますか?10?またはReferenceError?しかし、実際には、未定義が表示されます!
undefinedとReferenceErrorの違いについてお話しましょう。Undefinedは、変数が宣言されているが値がないことを意味しますが、それを格納するためにスコープ内に場所を開いています。 。
jsコードは実行前にコンパイラーによって1回コンパイルされるため、今回はすべての変数宣言と関数宣言(var a = 10;
ステートメントなど)が事前に実行されます。あなたの意見では、これは単なるステートメントですが、システムでは2つに分かれていますvar a ; 和a=10;
これはリフトと呼ばれているので、その前者は、事前に行われます。そして、jsの改善は地球環境だけでなく、あらゆる場面で有効です。
考える:
foo();
function foo () {
console.log(a);// undefined;
var a;
a = 10;
}
このコードのfoo関数は事前に宣言されているため、foo();は通常どおり実行できます。ただし、事前に出力の前にvarが実行されるため、undefinedと表示されます。
つまり、コード全体は次の形式になります。
function () {
var a;
console.log(a);
a = 10;
}
foo();
もう1つは関数の優先度です。関数の宣言は、次のような変数の宣言よりも優先されます。
foo();//2
var foo;
foo = function () {
console.log(1);
}
function foo () {
console.log(2)
};