最近ES6がリリースされた後、多くの情報源から、「var」の代わりに「const」と「let」を使用し、JavaScriptで「var」の使用をやめるべきだと言われました。
「var」がすべての観点で「let」よりも優れていないのであれば、なぜvarを修正するのか、あるいは、相互に並ばせる代わりに「var」を廃止しないのでしょうか。
var
よりも let
-関数の開始時にそれらを定義する場合、それらの意味は基本的に同じです。
var
を使用して新しいコードを書く本当の理由はないというのはあなたの言うとおりです(ただし、 this を除きます)。
インターネットには何十年も前のページがあり、誰もそれらを書き直すつもりはありません。言語からvar
を削除しても、実際に得られるものはありません。解釈されるHTMLやJavascriptなどの言語の場合-後方互換性は絶対に必須です。
それが、単にvar
を再定義しないことを選択した理由でもあります。次のコード例を見てください。
// THIS IS AN EXAMPLE OF BAD CODE. DO NOT COPY AND PASTE THIS.
if (logic) {
var output = "true"
} else {
var output = "false"
}
console.log(output)
var
がlet
のように動作するように変更された場合、console.log
はスコープの違いにより参照エラーを引き起こします。
少ないコードを書くために変数を再宣言する必要があるときがあると思います。
1つの例は、一意のIDを生成するこの関数です。
function makeUniqueId(takenIds) {
do {
var id = Number.parseInt(Math.random() * 10);
} while (takenIds.includes(id))
}
そのように呼び出すことができます
makeUniqueId([1,2,3,4,5,6,7])
ここでは、id
変数をdo
ブロック内で宣言し、関数スコープに「引き上げ」ます。 let
ブロックはwhile
ブロックからの変数を認識しないため、do
を使用するとエラーが発生します。もちろん、do..while
の前にlet
を縮小することもできますが、これにより、同じ関数スコープの変数が追加のコード行で作成されます。
別の例は、コードをdevtoolsコンソールにコピーして貼り付け、変数が再宣言されるたびに発生します。
もう1つの例。変数宣言をそれらの使用法に近いままにしたいが、それでもそれらを関数グローバルとして扱いたい場合はどうでしょうか?このようにlet
を使用すると、開発ツール(これらのすべてのBlock、Blockスコープ)でかなり混乱するような経験が得られます。
Var constとletを使用すると、すべてに独自の長所と短所があり、使用例によって異なります。
var
変数宣言は、コードの実行前に処理されます。 varで宣言されたJavaScript変数のスコープは、その現在の実行コンテキストです。関数の外部で宣言されたJavaScript変数のスコープはグローバルです。
let
Letステートメントを使用すると、スコープが使用されているブロックに限定されたスコープを持つ変数を作成できます。
const
constステートメントの値は1回だけ割り当てることができ、再割り当てすることはできません。 constステートメントのスコープは、letステートメントと同様に機能します。
ご理解頂けるとありがたいです。