TIL37⎟JavaScript : Scope
9265 ワード
scope & variable
for (var i = 0; i < 10; i++) {
/* ... */
}
console.log(i); // what will this output?
ここでは未定義またはエラーを推測できますが、値は10です.ほとんどの他の言語では、上記のコードがerrorを出力します.変数iはブロックに制限されているので寿命(!)全力を尽くすから.ただし、javascriptで変数
var
を使用する場合、for loopが完全に実行されると、最後の値はscopeに保持されます.したがって、blocklevel scopeのサポートは、ES 6の新しい
let
、const
キーワードを介してJavaScriptに適用される.変数contまたはletはblock level scopeであり、宣言前に参照できません.
変数varはfunction level scopeであり、宣言前に参照できます.
while solving this assignment...
function findSmallestElement(arr) {
if (arr.length == 0){
return 0
} else {
let min = arr[0]
for (let i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
}
数値からなるarrの値の中で最も小さい値を求める問題で、最初に基準値であるletmin=arr[0]をfor loopのblockに入れると、「minis notdefined」の値を出力するエラーが発生しました.for loop안에 넣어버리면 block level scope의 성질에 따라 변수 min의 값에 할당할 arr 함수를 가져올 수 없게 되기 때문이다!
変数をfor loop blockの外に移動することによってarrの値が得られ,問題は良好に解決された.const getEven = () => {
let result = [];
for (let i = 1; i <= 50; i++) {
if (i % 2 == 0) {
result.push(i);
}
}
return result;
};
1から50の自然数から偶数を求めて配列に戻るという問題では,let resultの位置をfor文またはif文に初めて位置決めし,結果として値は与えられなかった.ここでは、論理不足とコードが複雑であるほど、変数宣言が歪むことを示します.改めてコンセプトアレンジのscopeを整理する必要があると思います!
≪グローバル範囲|Global Range|Eas≫-JavaScriptアプリケーションのグローバル範囲
Local Scope - 1. Function Scope,
関数で宣言されたscope
-2. Block Scope
≪グローバル変数|Global Variables|Eas≫-アプリケーションで使用可能な変数(関数外で宣言)
Local variable-(関数で宣言)つまり、関数でのみ有効な変数
let globalMessage = 'global'; //global variable
function printMessage(){
let message = 'hello';
console.log(message); //local variable
console.log(globalMessae);
function printAnother(){
console.log(message);
let childMessage = 'hello';
}
console.log(childMessage); //ChildMessage is not defined
}
printMessage();
このようにネストされた関数では、printMessage関数で定義された変数もprintAnother関数からアクセスできるため、親として定義されたメッセージ値を取得できますが、親から子関数の値を表示しようとすると表示されません.
scope pollution
global変数を使うと近づきやすいので良いと思いますが、悪用するとプログラムに迷惑をかけます.
global変数がまだ生きている場合、変数値が常に変化している場合、変数を追跡するのは難しく、let、constとして宣言されている場所を見つけるのも難しい.そのため、これらの問題を避けるために、
グローバル変数ではなく地域変数を使用することを推奨します.
global変数はあちこち修正できないので、変数はできるだけblock scopeに分けるべきです.
💡 The reason is...
clockcoppingの変数はコードの品質を向上させ,コードがブロックに明確に区分されるため,コードの毒性が上昇する.
プログラムが終わる前に変数は生きていない(blockが終わるとローカル変数の命は終わる)ので、メモリも節約できます.
すなわち,グローバル変数の使用を避けるために努力し,
{}
内でlet
,const
をできるだけ使用し,新しく変数を作成する良好なscoping習慣を身につける.(•̀ᴗ•́)و ̑̑Reference
この問題について(TIL37⎟JavaScript : Scope), 我々は、より多くの情報をここで見つけました https://velog.io/@itssweetrain/TIL37JavaScript-Scopeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol