JavaScriptの関数スコープ

2980 ワード

まず、下のコードから何が出力されるかを当ててみます.
var str = 'hello,world';
function func1(){
    console.log(str);
    var str = 'hello,script';
    console.log(str);
}
func1();
あなたが望む出力は:
hello,world
hello,script
しかし、実際の出力結果は:
undefined
hello,script
コードをもう一度見てください.
function func2(){
    for(var i=0 ; i< 5 ;i++){
        if(i == 0){
            var str = 'hello,world';
        }
    }
    console.log(str);
}
func2();
あなたが望む出力はundefinedですが、実際の出力結果はハロー、worldです.
ブロックレベルのスコープと関数のスコープ
大多数の主流のプログラミング言語はブロックレベルの作用領域を採用しています.ブロックレベルの作用領域はその中に存在します.変数は括弧の外では見られません.JavaScriptは関数のスコープを採用しています.つまり、関数内で宣言されているすべての変数は、関数内でいつでも見られます.関数内の一つの循環内に宣言されている変数であっても、循環外でも見られます.そして、声明のすべての変数は関数の一番上に前倒しされます.
関数のスコープを知ると、関数fun 1は
var str = 'hello,world';
function func1(){
    var str;
    console.log(str);//str           ,     ,      undefined
    str = 'hello,script';
    console.log(str);
}
func 2は
function func2(){
    var str ;
    for(var i=0 ; i< 5 ;i++){
        if(i == 0){
            str = 'hello,world';
        }
    }
    console.log(str);
}
だから、関数のスコープを知ったら、上のコードを見れば、彼らの出力がなぜこのようになったのかが分かります.