0
b();
console.log(a);

var a = 'Hello World';

function b(){
    console.log('Called b!');
}

「ホイスト」という用語について読んだことがありますが、よくわかりません。変数が未定義に設定されているときに関数が実行されるのはなぜですか?

興味深いのは、変数にエラーが表示されなかったことです。しかし、それは未定義を示しました。しかし、変数を完全に削除すると、エラーが表示されます。つまり、変数はどこかに存在します。右?

しかし、それが存在する場合、なぜコンパイラはそれをコンパイルできず、ここで関数をコンパイルできないのでしょうか?

var a が巻き上げられていることはわかっています。エンジンが変数と関数を別の方法で処理している理由、つまり実行コンテキスト中に舞台裏で起こっていることを知りたいです。

エンジンが実行コンテキストを作成する方法についての詳細な説明は役に立ちます。

この質問では、javascript エンジンが関数と変数でどのように異なる動作をするかについて質問しています。そして、実行フェーズの作成状態と実行状態で正確に何が起こっているのか。したがって、重複した質問ではありません。

4

4 に答える 4

2

しかし、それが存在する場合、なぜコンパイラはそれをコンパイルできず、ここで関数をコンパイルできないのでしょうか?

基本的には、コードを実行せずにバインディングの値を決定できるかどうかに要約されます。

関数宣言自体はランタイム情報に依存しません。関数が呼び出されるまで本体は評価されないことに注意してください。したがって、コードを実際に実行しなくても、 の値がb関数であることは明らかです。

ただし、変数宣言の初期化値は実行時情報に依存する場合があります。このことを考慮:

var a = 10 + bar();

エンジンが式を評価せずに (そしてプロセスで実行せずに) 初期化値を「ホイスト」する方法はありませんbar

もちろん、あなたの例では、初期化値 ( 'Hello World') も静的であるため、引き上げることができます。しかし、そうすると動作に一貫性がなくなり、おそらくより混乱を招きます。


コントロールが新しい関数に入ったときに正確に何が起こるかは、仕様で定義されています。そこでは、変数宣言と関数宣言がどのように扱われるかを見ることができます。

于 2015-12-04T16:36:25.893 に答える