JavaScript-変数アップ

2632 ワード

まず例を見てみます.
var num = 10;

fun();

function fun(){
    console.log(num);   //  undefined

    var num = 20;

    console.log(num);   //  20
}
ここで一つの疑問があります.どうしてundefinedですか?10じゃないですか?
実際の解析過程はこうです.
function fun(){
    var num               //     

    console.log(num);

    num= 20;             //      

    console.log(num);
}

var num = 10;

fun();
これはJavaScriptの変数アップグレードです.JavaScriptの関数内で定義されている局部変数は、どの行の声明の割り当てに関わらず、解析時に関数宣言を関数の先頭部分に強制的に引き上げますが、変数の割り当てはコードを書く時に変数の行数によって与えられます.賦課は引き上げられていません.ただ声明が引き上げられました.
例を説明します.局所変数numの声明があるので、大域変数numは無視されますが、局部変数の声明は関数の先頭に引き上げられました.賦値がないので、consolie.log(num)はundefinedを出力します.
関数と変数が同名の場合、どのようにアップグレードされますか?見に来てください
console.log(showNum);   //  showNum  

var showNum = 10;

function showNum(){}
この解析過程はこうです.
function showNum(){}

var showNum      //     

console.log(showNum);

showNum = 10;
これは同じ識別子を持っている場合、変数宣言と関数がアップグレードされるからです.関数宣言は変数宣言を上書きしますが、変数の割り当ては上書きされません.直接コードをかけて、より直接的に考えて、例のコードを少し変えます.
var showNum = 10;

console.log(showNum);  //    10

function showNum(){}
ここを見て解析プロセスを書きません.変数宣言の同時初期化や値付けは関数よりも優先度が高いので、無視されません.
もちろん、ここでは理解を助けるだけの例です.実際の開発では絶対に変数と関数を同名にしてはいけません.