JAvascriptクラシック面接問題グローバル変数とローカル変数の役割ドメイン

2452 ワード

1.テーマ
var a = 10;
function test(){
    a = 100;
    console.log(a);
    console.log(this.a);
    var a;
    console.log(a);
}
test();

答え:100,10100解析:Javascriptは実行前にスクリプトファイル全体の宣言部分を完全に分析し(ローカル変数を含む)、変数の役割ドメインを決定するので、関数testの実行前に6行目がローカル変数aを宣言したため、関数内部のaはすでに宣言したローカル変数を指すので、4行目は100を出力します.5行目出力this.a,我々はすべて知っていて、関数の内部のthisポインタは関数の呼び出し者を指して、ここで関数testはグローバルオブジェクトに呼び出されて、だからthisポインタはグローバルオブジェクト(ここでwindow)を指して、だからthis.a = window.a,最初はグローバル変数a=10が生命していたので,5行目の出力結果は10であった.7行目の出力結果は100であり、局所変数aは3行目ですでに100が付与されているため、局所変数aの値を直接出力する.
2.テーマ
var a = 100;
function test(){
    console.log(a);
    var a = 10;
    console.log(a);
}
test();

答え:undefined,10解析:1つ目の例を見ると、出力結果は10 10だと思っている学生もいるかもしれませんが、結果は10 10ではありません.なぜですか.1例目の解析の第1文をよく見るとJavascriptは実行前にスクリプトファイル全体の宣言部分を完全に解析(ローカル変数を含む)するが、変数定義を事前に解析することはできない.この関数では、3行目を実行する前に、変数aが明らかになったと考えられるが、定義(ここでは付与)されていないため、3行目の出力結果はundefinedとなり、4行目a=10を実行すると変数aの値は10となるので、5行目の出力結果は10となる.
3.テーマ
var a = 100;
function test(){
    console.log(a);
    a = 10;
    console.log(a);
}
test();
console.log(a);

答え:100 10解析:関数の内部では、一般的にvarで宣言されるのは局所変数であり、varで宣言されていないのは一般的にグローバル変数であることを知っています.test関数内では、a=10でグローバル変数が宣言されているので、3行目のaはグローバル変数の値を出力し、関数の実行前にグローバル変数を宣言して100を割り当てているので、ここでは100を出力します.4行目はグローバル変数aに10を再付与するので、グローバル変数aの値は10となるので、5行目は10を出力する.一方、関数testの外部では、8行目にグローバル変数aの値が出力され、グローバル変数が10に再割り当てされるため、出力結果は10となる.