[JavaScript]クレーンとは?


Cのようなプログラミング言語では、ブロック内のコードは独自の有効範囲を有し、その変数が宣言されていないブロックの外には見えない.これをブロック有効範囲(block scope)と呼び,JavaScriptにはブロック有効範囲の概念はない.逆にJavaScriptは関数の有効範囲を使用します.変数は、変数定義の関数だけでなく、関数に埋め込まれた関数にも表示されます.
次のコードでは、変数i、j、kは異なる位置に宣言されるが、いずれも同じ有効範囲を有する.すなわち,3つの変数はいずれも関数の体内に定義される.
function test(o){
   let i = 0;							//i는 함수 전체에 걸쳐 정의된다.
   if(typeof 0 == "object"){
   		let j = 0;						//j는 블록뿐만 아니라 함수 전체에 걸쳐 정의된다.
          for(let k=0; k<10; k++){	//k는 반복문 외에도 함수 전체에 걸쳐 정의된다.
          console.log(k); 			//숫자 0부터 9까지 출력한다. 
       }
       console.log(k); 				//k는 여전히 정의되어 있다. 10을 출력한다.
    }
    console.log(j); 				//j는 정의되어 있고, 초기화되어 있지 않을 것이다.
}
JavaScriptの関数有効範囲(functionscope)とは、ある関数で宣言されたすべての変数が関数全体で有効であることを意味します.興味深いことに、これは変数がまだ発表されていない前に有効であることを意味します.このjavascriptの特徴は非公式に「昇格」と呼ばれている.JAvascriptコードは、関数のすべての変数を関数の上部に「引く」ように関数の上部に「引く」.次の例を示します.
var scope = "global";
function f() {
	console.log(scope); 	//"global"이 아니라 "undefined"를 출력한다.
    let scope = "local" 	//여기서 초기화하지만, 정의는 다른 곳에서 이루어졌다.
    console.log(scope);     //"local"을 출력한다.
}
領域変数を宣言するvar文はまだ実行されていないため、関数の最初の行が「global」を出力すると勘違いする可能性があります.しかし,関数の有効範囲規則のため,実際にはそうではない.領域変数は関数全体で定義されます.つまり、同じ名前のグローバル変数は、関数全体でその領域変数によって非表示になります.関数全体で領域変数が定義されている場合でも、var文の実行後にのみ実際に初期化されます.したがって、この関数は次のコードで示されます.次に、変数宣言が関数の上部に引っ張られ、3行目の代入文で処理されるように初期化されます.
function f() {
	var scope;				//지역 변수는 함수 맨 꼭대기에서 선언한다.
    console.log(scope); 	//scope 변수는 존재하지만 아직 "undefined" 값이다.
    scope = "local";		//이제 scope 변수가 초기화되고 제대로 된 값이 있다.
    console.log(scope);		//여기서는 우리가 기대한 값이 들어 있다.
}
ブロック有効範囲を有するプログラミング言語では、通常、変数を宣言する良いプログラミング方法は、できるだけこの変数を使用する最近位置で変数を宣言することである.ただし、javascriptにはブロックの有効範囲がないため、一部の開発者はすべての変数を関数の上部に宣言したり、変数を使用する場所の近くに宣言したりしない可能性があります.これにより、変数の真の有効範囲がソースコードに正確に反映されます.