最近、ES6がリリースされた後、多くのソースから "var"の代わりに "const"と "let"を使用するように提案されました。 「var」がすべての観点から「let」よりも利点がないのであれば、varを修正するだけでなく、「var」を互いに相殺するのではなく、なぜ非推奨にするのでしょうか?JavaScript - なぜ非推奨でないのですか
答えて
下位互換性。
var
をlet
(関数の開始時に定義した場合、その意味は基本的に同じです)を使用することには実質的な利点はないと言うのは正しいです。
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)
。
すべてには、var constを使用してそれぞれ長所と短所があり、letはそれぞれの用途に依存します。
var
変数宣言は、コードの実行前に処理されます。 varで宣言されたJavaScript変数のスコープは、現在の実行コンテキストです。 関数の外部で宣言されたJavaScript変数のスコープはグローバルです。
let
letステートメントを使用すると、スコープが変数を使用するブロックに限定して変数を作成できます。
const
const文の値は一度割り当てることができ、再割り当てすることはできません。 const文の有効範囲はlet文と同様です。
ご理解いただきますようお願い申し上げます。
あなたは 'var'の利点を挙げていませんでした。関数やグローバルレベルでも 'let'を使うことができます。ブロック内で' var'を宣言してからそのブロックの外で使うなど不愉快なことをする以外に、どこに利点がありますか? –
"*変数宣言はコードの実行前に処理されます。" - ['let'と' const'についても同じです(https://stackoverflow.com/q/31219420/1048572) – Bergi
私は時には少ないコードを書くために変数を再宣言する必要があると信じています。 「私はそれを得るの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ツール(すべてのブロック、ブロックスコープ)でかなり混乱することになります。
- 1. なぜorg.hibernate.cache.Cacheは非推奨ですか?
- 2. なぜbuildSessionFactory()は非推奨ですか?
- 3. なぜWeakMapのclear()メソッドは非推奨ですか?
- 4. PythonでMutableStringはなぜ非推奨ですか?
- 5. JDK 9のアプレットはなぜ非推奨ですか?
- 6. なぜTabActivityは非推奨(理由)ですか?
- 7. std :: iteratorはなぜ非推奨ですか?
- 8. なぜ 'center'、 'contains'などのメソッドがStringでは非推奨ですか?
- 9. Apache MahoutでMLPクラシファイアが非推奨になったのはなぜですか?
- 10. なぜMySQL Blobが推奨されないのですか
- 11. なぜエラー処理が推奨されないのですか?
- 12. Javaで推奨されないアノテーションを使用する代わりに非推奨のメソッドをコメントできないのはなぜですか?
- 13. SoundCloud api-v2は非推奨ですか?
- 14. 'gtk_widget_override_font'は非推奨です
- 15. setTabSFromPagerAdapterは非推奨です
- 16. カメラは非推奨です
- 17. FragmentActivity.getSupportMediaController()は非推奨です
- 18. タイプギャラリーは非推奨です
- 19. AppInvite.AppInviteApi.getInvitation()は非推奨です
- 20. WakefulBroadcastReceiverは非推奨です
- 21. NSGregorianCalendarは非推奨です
- 22. ConnectivityManager.CONNECTIVITY_ACTIONは非推奨です
- 23. stringByAddingPercentEscapesUsingEncodingは非推奨です
- 24. getMap()は非推奨です
- 25. cell.imageは非推奨です
- 26. replaceGlyphAtIndexは非推奨です
- 27. GameObject.rendererは非推奨です
- 28. $ HADOOP_HOMEは非推奨です
- 29. AuthorizationExecuteWithPrivilegesは非推奨です
- 30. PlacePicker.getPlace()は非推奨です
それを変更したり削除すると、コードの十億行について壊すので。 –
'var'は、関数スコープを望み、スコープをブロックしたくないときに、' let'よりもずっと便利です。 – Paulpro
まだ 'var'の用途があります。 – jhpratt