var、let、constの違い


varで変数を宣言できますが、なぜlet、constが現れるのでしょうか.
理由を明らかにするために、まず変数の宣言と割り当て、エスケープ、スキャンを理解します.

へんすう


変数は、1つの値を格納するために保持されるメモリ領域、すなわち、名前によってアドレスを識別するために命名された名前です.
const myNumber = 23
// 변수명(식별자): myNumber
// 해당 값의 위치(메모리 주소): 0012CCGWH80
// 변수 값(저장된 값): 23
JavaScriptは管理言語であり、開発者がメモリを直接制御することは難しい.
したがって,開発者はメモリアドレスを直接介して値を格納したり参照したりする必要はなく,変数を介してメモリ値に安全にアクセスできる.
上記変数名mynumberは、変数の値23ではなくメモリアドレス(0012 GGWH 80)を記憶している.
変数名を使用すると、変数名とマッピングされたメモリアドレスから格納値(23)が返されます.
このように、変数に値を格納することをアサイメント(assignment)、参照(reference)を変数に格納する値、変数名をJavaScriptエンジン(declaration)に通知することと呼ぶ.

変数の宣言


変数の宣言は、var、let、constとしてES 6にconst、letを追加できます.
JavaScriptでは、変数宣言は宣言=>初期化ステップで完了します.
var cky
console.log(cky) // output: undefined
varを使用する変数の宣言は、宣言、初期化フェーズを同時に行い、ckyに未定義を暗黙的に割り当てることで初期化されます.
でも逆にコンソールログを先に撮っても、戻り値が定義されていない場合があります.
console.log(cky) // output: undefined
var cky
変数が宣言されていない場合に、値が定義されていないコンソールが表示されるわけがありません.
これは、変数宣言が実行時に行われるのではなく、前のステップで最初に実行されるためです.
JAvascriptエンジンは、ソースコードの各行を実行する前に、変数宣言を含むすべての宣言(ex変数宣言、関数宣言など)を見つけてから実行します.すなわち,変数宣言の位置にかかわらず,他のコードよりも先に実行される特徴を「昇格」と呼ぶ.

変数の割当て


変数に値を割り当てるときに=を使用します.
var cky // 변수 선언
cky = 'hello' // 값의 할당

var cky = 'hello' // 변수 선언과 할당
変数宣言と割り当ては、1つの文に簡略化できますが、2つの実行点は異なります.
変数宣言は実行時より前に実行されますが、値の割り当てはソースコード順に実行される実行時に実行されます.すなわち、2番目の変数の宣言と割り当ては反発しますが、値の割り当ては実行時に実行されるため、1番目の行がコンソールの場合、出力が事前に定義されます.
console.log(cky) // output: undefined

var cky = 'hello'
console.log(cky) // output: hello

関数の加速

// 함수 참조
console.dir(add) // output: f add(x, y)
console.dir(sub) // output: undefined

// 함수 호출
console.log(add(2, 5)) // output: 7
console.log(sub(2, 5)) // output: Uncaught TypeError: sub is not a function

// 함수 선언문
function add(x, y) {
  return x + y
}

// 함수 표현식
var sub = function(x, y) {
  return x + y
}
関数宣言文addでは、実行時までに関数を実行して、関数自体をより良くすることができます.つまり、価値があるかもしれない.
関数式は、上記の変数値分配関数のように、実行時の前にunderfinedに初期化し、実行時に関数の式を関数に割り当て、オブジェクトとして値を表示します.
つまり、関数宣言は変数宣言と同様に、実行時に表示値をハイライトすることができます.
関数式は、実行時に値がある場合があります.

スキャン


識別子の有効範囲を表し、宣言された場所によって有効範囲が異なります.
グローバル宣言の変数にはグローバル範囲があり、ゾーン宣言の変数にはゾーン範囲があります.
グローバル変数は、任意の場所で参照できます.領域変数は、独自の領域スキャンとそのサブ領域スキャンで有効です.
javascriptでは、すべてのコードブロックがブロックレベルスキャンと呼ばれる領域スキャン(exif、for、while、try/catchなど)を作成します.ただし、varと宣言された変数は、関数コードブロックのみを領域スキャンと見なします.これを関数レベルスキャンと呼びます.
var a = 1

if (true) {
  var a = 5
}

console.log(a) // output: 5
上のコードを見ると、関数ではなくifでvar宣言aを使用するため、グローバル変数とみなされます.これは.
既存のa変数が繰り返し宣言されると、下位コンソールでも出力値が5になることがわかります.
上記の例はコードが短いので,問題の発生と位置を特定できるが,実際の作業ではそうではない.グローバル変数のために再割り当てが発生した場合、またはグローバルスキャンを共有するために同じ名前の変数が発生した場合、予期せぬ変数の値が変更される可能性があります.したがって,関数コードブロックのみが領域走査であるvarを認める代わりにcosnt,letを用いることを提案する.

var、let、const差異


前のvarの問題は大体3つあります.
変数を繰り返し宣言できます
変数宣言の前に変数を参照すると常にundefinedが返されます.
関数レベルスキャン.
let,constは上記の3つの問題を解決した.

1.変数を繰り返し宣言できません


let:変数の重複を宣言できません.再割り当てできます.
let name = 'cky'
console.log(name) // output: cky

let name = 'abcd' // output: Uncaught SyntaxError: Identifier 'name' has already been declared
//중복 선언 불가

name = 'abcd'
console.log(name) // output: abcd, 재할당은 가능
const:変数を繰り返し宣言することはできません.変数を再割り当てすることはできません(元の値は使用できません.単一のオブジェクトは使用できます).
const name = 'cky'
name = 'abcd' // output: Uncaught TypeError: Assignment to constant variable.
// 원시값 재할당 불가

const name = {
  eng: 'cky',
}
name.eng = 'abcd'

console.log(name) // output: { eng: "abcd" }
// 객체의 재할당은 가능
またletとconstの違いの一つは,宣言と初期化を同時に行わなければならないことである.
const name; // output: Uncaught SyntaxError: Missing initializer in const declaration
const name = 'cky'

2.変数加速


let:宣言フェーズと初期化フェーズを別々に行う
const:宣言と初期化を同時に行う

3.ブロックレベルスキャン


すべてのコードブロック(exif、for、while、try/catchなど)は、領域スキャンとして認可されたブロックレベルスキャンに従う.

整理する


変数のスキャンはできるだけ簡略化し、縮小すべきであり、変数の値をより容易に理解するためにvarではなくlet、constを使用することが望ましい.また、変数の値が定数の場合、letを使用するよりもconstを使用する方が安全です.
リファレンス
https://www.howdy-mj.me/javascript/var-let-const/