Javascript関数と変数のアップグレード


変数の昇格と関数の昇格は基本的に面接試験で必ずテーマを聞きます.
//         
        console.log(a)
        if (a) {
            var a = 1;
            console.log(a)
        }

        function a() {
            console.log(this);
        }
        console.log(a);

        a()
        
この栗について解析してみます.
変数とよく定義されていることを知っていますが、スコープの一番前に引き上げられます.
唯一の確認が必要なのは変数と関数の順序です.
私たちは関数が第一公民で一番前に上がると予想していますか?
//            
        function a() {
            console.log(this);
        }
        var a;
        console.log(a)
        if (a) {
            a = 1;
            console.log(a)
        }
        console.log(a);

        a()
私達が予想した解析結果は
//undefined/undefined/エラーが発生しました.
理由関数は上のvarにあります.最初のconsolineの時にaは値を与えませんでした.その結果はundefinedで、ifはfalseのために最後のconsolieだけが残っています.undefinedも最後のa is not a functionです.
でも結果は
私は機知がありますが、予想が間違っていますか?
//    
        var a;
        function a() {
            console.log(this);
        }
        console.log(a)
        if (a) {
            a = 1;
            console.log(a)
        }
        console.log(a);

        a()
そうですか?比較した結果、人工解析の結果、1、a()2、13、14、a()のエラーが発生しました.
ブラウザの実行結果:大丈夫です.
ここですべての完璧さを見ましたが、やはり高品質の文章を探し直しました.私が間違っていたことを発見しました.実行結果は正しいですが、ブラウザと人工解析はやはり違っています.私たちが最初に予想した通り、関数優先です.
変数と関数というタイトルが出ましたので、一緒に言います.
//     
function a(){ console.log(a) }
console.log(a)
var a = 1
a()
まず上に述べました.私たちの予想と考えは間違っています.
正しい解析の順番はこうです.
function a(){ console.log(a) }
var a;
console.log(a)
a = 1
a()
しかし、これは重要なブラウザで実行された結果です.これは私が知っている原理を説明します.
同じ名前の変数と関数は、関数が一番前に上がって、変数の次に、なぜ結果が私達の人工的なundefinedではないですか?変数が無視されるのは無視されるからです.
function a(){ console.log(a) }
var a;//  
console.log(a) //      
a = 1
a()// a is not a function
パーフェクト
まだありますか?はい、同じ名前の変数はどの順番で、同じ名前の関数はどの順番ですか?
同名の変数
console.log(a)
var a = 1
console.log(a)
var a = 2
console.log(a)

//         

var a;
var a; //  
console.log(a) // undfined
a = 1
console.log(a) //1
a = 2
console.log(a)//2
*同じ名前の変数は、ステートメントがアップされ、後に無視されます.
同名の関数
function a(){console.log(1)}
console.log(a)
function a(){console.log(2)}
console.log(a)
a()

//   
function a(){console.log(1)}
function a(){console.log(2)}
console.log(a)
console.log(a)
a()
実行結果
同じ名前の関数が上書きされると思います.
やっと終わった
ご賞賛は私の継続の原動力です.ありがとうございます.