2017-11-24 59 views
0

最近、ES6がリリースされた後、多くのソースから "var"の代わりに "const"と "let"を使用するように提案されました。 「var」がすべての観点から「let」よりも利点がないのであれば、varを修正するだけでなく、「var」を互いに相殺するのではなく、なぜ非推奨にするのでしょうか?JavaScript - なぜ非推奨でないのですか

+2

それを変更したり削除すると、コードの十億行について壊すので。 –

+3

'var'は、関数スコープを望み、スコープをブロックしたくないときに、' let'よりもずっと便利です。 – Paulpro

+1

まだ 'var'の用途があります。 – jhpratt

答えて

2

下位互換性。

varlet(関数の開始時に定義した場合、その意味は基本的に同じです)を使用することには実質的な利点はないと言うのは正しいです。

varを使用して新しいコードを書く本当の理由はないと思います。

インターネットには数十年前のページがありますが、誰もそれを書き直すつもりはありません。言語からvarを削除することによって、実際には何も得られません。解釈されるHTMLやJavascriptのような言語の場合、後方互換性は絶対的に必須です。

これは、単にvarを再定義しないことを選択した理由です。次のコード例を参考にしてください。 varは、その後console.logが原因スコープ差の参照エラーを引き起こすletのように動作するように変更された場合は

// 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) 

+0

ありがとうございます。それは有り難いです。 しかし、あなたの答えは「なぜvarを非難しないのですか」という質問の一部を解決するだけです。 "var"を最初からリファクタリングし、 "let"を導入しないのはどうですか?それには理由がありますか? –

+1

再び、下位互換性。人々があなたの質問のコメントに記載されている恐ろしい方法で 'var'を使用していた場合、そのコードは意味を変え、おそらく警告を出すことなく、おそらく警告を出します。 – Shadow

+0

例を追加しました。 – Shadow

1

すべてには、var constを使用してそれぞれ長所と短所があり、letはそれぞれの用途に依存します。

var 

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

let 

letステートメントを使用すると、スコープが変数を使用するブロックに限定して変数を作成できます。

const 

const文の値は一度割り当てることができ、再割り当てすることはできません。 const文の有効範囲はlet文と同様です。

ご理解いただきますようお願い申し上げます。

+0

あなたは 'var'の利点を挙げていませんでした。関数やグローバルレベルでも 'let'を使うことができます。ブロック内で' var'を宣言してからそのブロックの外で使うなど不愉快なことをする以外に、どこに利点がありますか? –

+0

"*変数宣言はコードの実行前に処理されます。" - ['let'と' const'についても同じです(https://stackoverflow.com/q/31219420/1048572) – Bergi

1

私は時には少ないコードを書くために変数を再宣言する必要があると信じています。 「私はそれを得るのdoブロック内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を生成し、この機能です機能範囲に「吊り上げた」。ご覧のとおり、idはおそらく何度も再宣言されます。 letを使用すると、エラーが発生します。再宣告のせいでもない。 whileブロックにはdoブロックの変数が表示されないため、クラッシュします。もちろんdo..whileの前にletを宣言することもできますが、それはコードの余分な行で同じ関数スコープ変数を作成します。

もう1つの例であるは、コードをdevtoolsコンソールにコピーし、変数が再宣言されるたびに表示されます。

さらにもう1つの例。変数の宣言をその使用法に近づけても、それらを関数のグローバルとして扱いたい場合はどうすればよいでしょうか?このようにしてletを使用すると、devツール(すべてのブロック、ブロックスコープ)でかなり混乱することになります。 enter image description here

しかしvarは1「ローカル」リストにそれらを一緒に「続けて」: enter image description here

関連する問題