scope


範囲は変数の近接性と生存期間を意味する.一方,これは変数の参照範囲を意味する.
JSのscopeは、グローバル変数とゾーン変数に分けられますが、グローバル変数は、その名の通り、グローバルでコードのどこでも参照できる変数で、ゾーン変数は定義された関数内でのみ参照できます.すべての変数にはスキャンがあり、グローバル変数にはグローバルスキャンがあり、領域変数には領域スキャンがあります.

JSの有効範囲特徴


JSの有効範囲には、以下の4つの特徴があります.

関数単位の有効範囲(関数level-scope)


関数単位の有効範囲とは、関数コードブロック内で宣言された関数が関数コードブロック内でのみ有効であり、関数外部では無効であることを意味します.
また、変数をES 6に導入されたletとして宣言する場合、ボックスレベルの汎用範囲(box-level scope)を使用することができる.
// function-level scope
let brave_girls = 'rollin'
function k_pop(){
 let brave_girls = 'just dirve'
 console.log(brave_girls)
}
k_pop() // 'just drive'
console.log(brave_girls) // 'rollin'

// box-level scope
let chicken = 'nene'
{
 let chicken = 'kyochon'
 console.log(chicken) // 'kyochon'
}
console.log(chicken) // 'nene'

重複変数名の許可


グローバル領域で変数を宣言すると、任意の場所で参照できるグローバル変数になります.グローバル変数は、「グローバルオブジェクト」(Global Object)ウィンドウのプロパティです.JavaScriptがcontとして宣言された変数でない場合、変数名の重複が許可されるため、エラーメッセージは発生しません.グローバル変数を使用する必要がない場合は、領域変数を使用することが望ましい.変数のスキャンが狭いほど安全です.

大域を黙示する(大域を隠す)

function pizza(){
 domino = 'is good'
}
pizza()
console.log(domino) // 'is good'
上の関数ではdominoという変数は宣言されず、割り当てられただけです.pizza関数にdominoという変数がなく、親領域(グローバル経由)にdominoの変数が見つからない場合、JSはデフォルトdominoをグローバル変数として使用します.

Lexical Scoping(static scoping)


JavaScriptは、関数宣言時に有効範囲を持ちます.
let dismas = 'live'
function condition_dismas(){
 console.log(dismas)
}
function kill_dismas(){
 dismas = 'die'
 condition_dismas();
}
kill_dismas() // 'die'
condition laves関数を実行する前に、laves値を再割り当てすることで変数lavesの値を変更します.
let dismas = 'live'
function condition_dismas(){
 console.log(dismas)
}
function kill_dismas(){
 let dismas = 'die'
 condition_dismas();
}
kill_dismas() // 'live'
kill laves関数の内部でlaves変数を宣言して割り当てると、結果値が変化します.関数を最初に宣言した瞬間、関数内部の変数はミラーに最も近い位相範囲の変数を参照します.
上記condition depress関数のdepressは、最近の上流地域、すなわち深セン駅のdepressである.したがって、kill lavesのcondition lavesを呼び出しても、kill laves関数の領域変数を参照するlavesではなく、グローバル変数lavesを参照します.