変数
変数って何?
var, let, const の使い方
変数はオブジェクトである
変数の七変化
グローバル変数・ローカル変数


変数って何?
変数とは数学で習った変数xなどを思い出すのではないでしょうか。しかし、 もっと広い意味で使われています。文字列も変数で扱えます。
変数とはデータの入れ物です。以前は、
var a = 123;
これだけでした。現在では、
var, let, const
3つの変数宣言の仕方があります。面倒ですね。

var, let, const の使い方
constは一番わかりやすいです。例えば、円周率のように一度セットしたら 与えを変えられない定数で使います。

const pi = 3.14;
pi = 8;
console.log(pi);

pi = 8;
Uncaught TypeError TypeError: Assignment to constant variable.
になり
console.log(pi);
は実行されずに終了してしまいます。constはわかりやすいですね。 次にvarはお馴染みです。こんなあいまいなコードは書かないと思いすが、

for(var i= 0; i < 3; i++){
	console.log("outer i= " + i);
	for(var i =0; i < 5; i++){
		console.log("inner i= " + i);
	}
}
console.log(i);	
結果は、

outer i= 0
inner i= 0
inner i= 1
inner i= 2
inner i= 3
inner i= 4
6
となります。内側のループが5回、外側のループが1回になっています。
内側のループ終了後にiが6になっているので外側のループが1回だけになります。
内側のループをlet i=0にすることで、期待していた(?)結果になります。

for(var i= 0; i < 3; i++){
console.log("outer i= " + i);
	for(let i =0; i < 5; i++){
		console.log("inner i= " + i);
	}
}
console.log(i);	

	outer i= 0
	inner i= 0
	inner i= 1
	inner i= 2
	inner i= 3
	inner i= 4
	outer i= 1
	inner i= 0
	inner i= 1
	inner i= 2
	inner i= 3
	inner i= 4
	outer i= 2
	inner i= 0
	inner i= 1
	inner i= 2
	inner i= 3
	inner i= 4
	3
letでiを宣言すると外側ループのiと内側ループのiは別物ということになります。
宣言したデータの有効範囲(スコープ)は、以下の通りです。
var
関数スコープのローカル変数を宣言とある値に初期化することもできる。
let
ブロックスコープのローカル変数を宣言とある値に初期化することもできる。
const
ブロックスコープで読み取り専用の名前付き定数を宣言する。

変数はオブジェクトである
なんかよくわからない記述ですが、C言語と比べるとわかりやすいと思います。
int a = 1;
と宣言して表示のためにchar型にするには、
itoa(),sprintf()などの関数を使ってchar型の文字列を取得します。
しかし、JavaScriptでは変数はオブジェクトなのでオブジェクトを操作する メソッドが実装されています。
a.toString();
でString型のデータを取得することができます。
更に、関数もオブジェクトなので、

var add2 = function(a){
	return a + 2;
}

このような記述ができます。

変数の七変化
JavaScriptにおける変数はバリアント型です。

	var a = 3.14;
	a = "abc";

数値で宣言されたaに文字型データを代入してもエラーになりません。 バリアント型になっています。これは便利なようで弊害があります。 本当は数値のデータなのに誰か文字型で書き換えてもエラーになら ないので、書き換えた人は問題なしと思うでしょう。しかし、この 書き換えで別の処理に不具合が発生することがあります。C言語の ようにコンパイル時にエラーがでれば、間違ったデータを使って いることがわかります。
バリアント型は便利なようで危ない側面を持っています。

グローバル変数・ローカル変数
グローバル変数(広域変数)は、すべての関数で有効です。 例えばシステムの設定値などによく使われます。
ローカル変数(局所変数)は関数内だけで有効です。

	var a = 3.14;
	function fn1(){
		let b = 1.41;
		console.log(a);	
		console.log(b);	
	}

	fn1();

aはグローバル変数。bはローカル変数です。
期待通り 3.14と1.14が表示されます。

	function fn1(){
		let b = 1.41;
		console.log(a);	
		console.log(b);	
	}
	var a = 3.14;

	fn1();

これでも期待通り 3.14と1.14が表示されます。

	function fn1(){
		let b = 1.41;
		console.log(a);	
		console.log(b);	
	}
	
	fn1();
	var a = 3.14;

undefinedと1.41が表示されます。つまり変数aが未定義状態です。 変数を各場所は上の行に書いておけば無難です。
初期化しないと、

	var a;
	function fn1(){
		let b = 1.41;
		console.log(a);	
		console.log(b);	
	}
	
	fn1();
同様にundefinedと1.41が表示されます。