web-dev-qa-db-ja.com

なぜvarは廃止されないのですか?

最近ES6がリリースされた後、多くの情報源から、「var」の代わりに「const」と「let」を使用し、JavaScriptで「var」の使用をやめるべきだと言われました。

「var」がすべての観点で「let」よりも優れていないのであれば、なぜvarを修正するのか、あるいは、相互に並ばせる代わりに「var」を廃止しないのでしょうか。

12
Leonard Li

下位互換性。

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)

varletのように動作するように変更された場合、console.logはスコープの違いにより参照エラーを引き起こします。

13
Shadow

少ないコードを書くために変数を再宣言する必要があるときがあると思います。

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スコープ)でかなり混乱するような経験が得られます。 enter image description here

しかし、varは、それらを1つの「ローカル」リストにまとめます: enter image description here

1
vloginov

Var constとletを使用すると、すべてに独自の長所と短所があり、使用例によって異なります。

var

変数宣言は、コードの実行前に処理されます。 varで宣言されたJavaScript変数のスコープは、その現在の実行コンテキストです。関数の外部で宣言されたJavaScript変数のスコープはグローバルです。

let

Letステートメントを使用すると、スコープが使用されているブロックに限定されたスコープを持つ変数を作成できます。

const

constステートメントの値は1回だけ割り当てることができ、再割り当てすることはできません。 constステートメントのスコープは、letステートメントと同様に機能します。

ご理解頂けるとありがたいです。

0
Sultan Khan