[programmers] TIL_DAY-13
10615 ワード
✅ Scope
変数の範囲はどこからどこまでですか?
プログラミング言語を学ぶとき、scopeは欠かせない概念です.宣言した変数がどこにあるか、どこで使用できるかを知る必要があります.
スキャンを大きく2つに分類すると、グローバルスキャンとゾーンスキャンに分けることができます.変数をグローバル範囲に宣言すると、コードの任意の場所でグローバル範囲内の変数を参照できます.
変数をゾーンスキャンに宣言する場合は、その変数を宣言するゾーンでのみ参照できます.(サブ領域を含む.)
// global
var globalVar = 10;
function isGlobal() {
console.log(globalVar);
}
isGlobal(); // 10;
// local
function isLocal() {
var localVar = 20;
console.log(localVar);
}
isLocal(); // 20;
console.log(localVar); // localVar is not defined
上記のコードによれば、グローバルスキャンによって宣言されたグローバルVar変数はisGlobal()関数内でアクセスできます.グローバルスキャンの変数は、コード内の任意の場所で参照できます.一方、localVal変数については、isLocal()関数の内部で宣言されるため、isLocal関数領域スキャンがあります.外部から参照できません.
スコフの種類はこれだけではない.領域スキャンはブロックレベルスキャンと関数レベルスキャンに分けられる.これは、地域をどのように分類するかによって異なります.
ブロックレベルスキャンの場合:{...}ブロック内部をエリアとして使用します.関数レベルスキャンではfunction(){...}ブロック内部をエリアとして使用します.
どうせ同じ内部を指しているのではないでしょうか.
ここでいうブロックは、ユーザが単独で使用するブロックだけでなく、文条件文を繰り返すブロックも含む.
// block level scope & function level scope
for(let i = 0; i < 3; i++) {
var blockVar = 10 * i;
console.log(blockVar); // 0 10 20
console.log(i); // 0 1 2
}
console.log(blockVar); // 20
console.log(i) // i is not undefined
コンソールはここでどのように出力されますか?for문
案で宣言されたblockVar
はvar
であるため、함수 레벨 스코프
に従う.したがって、ここではグローバル変数です.{}内部にあるが、var
の特性のため、ここではグローバル変数と見なされ、外部から参照することができる.逆に、i
はfor문
内部で宣言され、let
は블록 레벨 스코프
に従うため、for文内部でのみ参照できます.function outFunctionBlock() {
var outFunctionValue = 10;
function inFunctionBlock() {
var inFunctionValue = 20;
console.log(inFunctionValue);
console.log(outFunctionValue);
}
inFunctionBlock();
console.log(outFunctionValue);
console.log(inFunctionValue);
}
outFunctionBlock();
このコードを実行すると、outFunctionBlock
で宣言されたoutFunctionValue
はoutFunctionBlock 스코프
を有します.内部定義のinFunctionBlock
で宣言されたinFunctionValue
は、inFunctionBlock 스코프
を有する.したがって、inFunctionBlock
で動作するコンソールは、通常20,10を出力する.ただし、outFunctionBlock
で動作しているコンソールではoutFunctionValueは正常に出力されていますが、inFunctionValue is not defined
でエラーが発生しました.✅ JavaScript Scope!
他の言語とは異なり、javascriptはブロックレベルのスキャンではなく関数レベルのスキャンに従います.これらの欠点を補うために、
let
const
が追加された.JavaScriptコードを作成する場合、他の言語とは異なり、エントリポイントは別にありません.したがって,変数の使用を考慮しなければ,グローバルとして容易に使用できる.
Lexical Scope
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo();
bar();
このコードの実行結果を予測すると、x
は전역 변수
と宣言され、foo 함수
からx
は10に変更され、bar 함수
が実行される.したがって、bar 함수
の内部には、変更後のx
が出力される.その結果、10 10
が出力される見込みです.JavaScriptはLexical Scopeに従います.
javascriptは
렉시컬 스코프
に従うため、上記の予測は間違っています.Lexicalscopeによると、함수를 어디서 호출하는지에 따라 스코프가 결정
ではなく어디서 선언하였는지에 따라 스코프가 결정
です.これに基づいて上記のコードを予測すると、
전역 변수 x
および함수 foo, bar
が宣言される.foo 함수
をx
に変更し、10
を実行する.bar 함수
宣言はbar 함수
であるため、전역
に従う.전역 스코프를
のうち전역 스코프
は既存のx
であるため、1
を運転するとfoo 함수
が出力され、1
を運転するとbar 함수
も出力される.Lexical Scopeに準拠したJavaScriptを使用する場合は、関数の呼び出し位置よりも関数の宣言位置を明確にする必要があります.
注意:poiemaweb.com
整理する
プログラムを作成するときは、変数の有効範囲、範囲、範囲を熟知してこそ、プログラムの流れと動作を正確に予測することができる.また,プログラミングの過程では,グローバル変数を必要とする時刻が多い.グローバル変数のみを使用してコードを記述するので、どこでも参照できますので、プログラムを記述するのは便利です.しかし、いくつかの本や専門家によると、グローバル変数を使用しないことをお勧めします.グローバル変数を乱発すると,ある瞬間にコードストリームを読み取ることができず,コードが汚くなる.したがって,グローバル変数の使用を最大限に減らすために,種々の方法を習得し実践すべきである.😅
Reference
この問題について([programmers] TIL_DAY-13), 我々は、より多くの情報をここで見つけました https://velog.io/@93minki/programmers-TILDAY-13テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol