1. var,let,const


モダンjavascriptコアガイド

1.1 var、let、constの違い


var


varキーワードとして宣言された変数は、関数スキャンに依存します.
逆に、forループ(ブロックスキャン)内でvarキーワードで変数を宣言する場合は、forループの外でこの変数を使用することもできます.
for( var i =0; i<10; i++) {
  var leak = 'I am available outside of the loop':
}

console.log(leak);
// I am available outside of the loop

function myFunc() {
  var functionScoped = 'I am available inside this function';
  console.log(functionScoped);
}
myFunc()
//I am available inside this function
console.log(functionScoped)
// ReferenceError: functionScoped is not defined
第1の例では、varの値は、ブロックスキャンの外であってもforループの外でアクセスすることができる.
第2の例では、varは関数の範囲内に制限され、関数の外部からアクセスできません.

let

let(およびconst)キーワードとして宣言される変数は、블록 스코프に属する.
すなわち、変数を宣言するブロックおよびそのサブブロックでのみ変数を使用できます.
// let 사용의 예
let x = 'global';

if ( x==='global') {
 let x = 'block-scoped';
 
 console.log(x);
 //block-scoped
}

console.log(x)
// global

// var 사용의 예
var y = 'global'

if ( y == 'global') {
  var y = 'block-scoped';
  
  console.log(y);
  // block-scoped
}

console.log(y);
// block-scoped
上記の例に示すように、ブロックスキャン内でletと宣言された変数に新しい値を指定すると、この値はブロック外で一定に保たれる.
逆に、varと宣言された変数に対して同じ操作を実行すると、ブロックスキャン外部からアクセスできるため、ブロック外部でも値の変更が見られる.

const

letと同様に、constと宣言された変数もブロックスキャンに属しますが、差異がある場合は、変更値の再割り当てや値の再宣言はできません.
const constant = 'i am a constant';
const = 'i can't man'
// Uncaught TypeError: Assignment to constant variable
ここで注意したいのは、constと宣言された変数が不眠症を意味するわけではないことです.

constにオブジェクトが含まれている場合は?

const person = {
 name: 'shin',
 age : 27,
},

person.age = 26
console.log(person.age)
//26
この場合、問題は変数全体を再割り当てすることではなく、属性の1つだけを再割り当てすることです.
また、constオブジェクトを未知のオブジェクトコンテンツに固定することもできます.

TDZ


今回議論する概念はTDZ(temporal dead zone一時無効領域)である.
console.log(i);
var i = 'i am kim'
//undefined

console.log(j);
let j = 'i am kim'
//ReferenceError: cna't access lexical declaration ....
varは、定義の前にアクセスできますが、その値にアクセスできません.letconstは定義するまで近づけない
var、let、constは、他のソースから読み取ることができるコンテンツですが、hoistingのターゲットです.
これは、コードが実行される前に処理され、対応するスキャンが行われることを意味します(グローバルでもブロックでも...).上へ行く.varの最大の違いは、定義する前に近づくことができることです.
すなわち、定義する前に未定義の値が存在する.
逆にletは,変数が線形に変化するまで非アクティブ領域(TDZ)に一時的に存在する.
したがって、初期化前に変数にアクセスするとエラーが発生します.
定義されていない値を取得するよりも、コードデバッグに適しているエラーが発生します.