JavaScriptで変数を宣言しないとどうなりますか?
変数宣言なしで変数を使うことはできる?
結論から言うと、グローバルスコープであれば、宣言なしで変数を使用することは可能です。varキーワードを使わずに値を代入した変数は「暗黙のグローバル変数」として扱われ、スコープチェーンをたどって参照されます。
以下の例では、varキーワードを使わずに宣言された変数「points」が、スコープチェーンをどのようにたどるのかを確認できます。
<html>
<body>
<script>
var rank = 5;
points = 50;
marks = 300;
// 匿名関数
(function() {
points = 100; // グローバルスコープのpointsを上書き
var rank = 4; // この関数のスコープに新しいrank変数が作られる
var marks = 900;
document.write(rank+"\r\n"); // 4と出力
document.write(points+"\r\n"); // 100と出力
document.write(marks+"\r\n"); // 900と出力
})();
document.write('<br/>');
document.write('<br/>');
document.write(rank+"\r\n"); // 5と出力
document.write(points+"\r\n"); // 100と出力
document.write(marks+"\r\n"); // 300と出力
</script>
</body>
</html>
コードの解説
このコードの動作ポイントを整理してみましょう。
- points:varなしで代入されているためグローバル変数として扱われます。匿名関数内で100を代入すると、グローバルの値そのものが上書きされるため、関数の外でも100と出力されます。
- rank:関数内でvar付きで宣言されているため、関数スコープに新しい変数が作られます。グローバルのrank(値は5)には影響せず、関数の外では元の5が出力されます。
- marks:関数内でvar付きで宣言されているため、関数内では900、グローバルでは300という別々の値を保ちます。
注意点:暗黙のグローバル変数のリスク
宣言なしで変数を使うことは技術的には可能ですが、次のような問題を引き起こすため、実務では推奨されません。
- 意図せずグローバル変数を上書きしてしまう恐れがある
- 変数のスコープが分かりにくくなり、バグの原因になる
- 「use strict」(厳格モード)では宣言なしの代入はエラーになる
ES2015(ES6)以降ではletやconstを使い、必ず宣言してから変数を使用するのがベストプラクティスです。スコープを明確にすることで、予期しない動作を防ぎ、保守性の高いコードを書けます。
-
JavaScriptのアロー関数を使ってはいけない場面とは?オブジェクトメソッドでの落とし穴
JavaScriptのアロー関数(矢印関数)は、コードを簡潔に書ける便利な構文ですが、あらゆる場面で使えるわけではありません。特にオブジェクトのメソッドとしてアロー関数を定義するのは避けるべきです。 その理由は、アロー関数には独自のthisが存在しないためです。アロー関数は、定義された場所を取り囲むレキシカルスコープからthisの値を受け取ります。グローバルスコープで定義した場合、そのthisはオブジェクト自身ではなくwindowオブジェクトを参照します。 その結果、本来なら対象オブジェクトのプロパティに対して行うはずの設定や参照が、誤ってwindowオブジェクトのプロパティに対して実行され
-
WhatsAppをアンインストールするとどうなる?アカウント削除との違いを徹底解説
WhatsAppをアンインストールすると、実際に何が起こるのか考えたことはありますか?誤って削除してしまった場合でも、何らかの理由で意図的に消す場合でも、アンインストールした瞬間にアプリはスマホから姿を消します。連絡先のリストにはあなたの名前が残ったままですが、メッセージは届かなくなります。音声通話もビデオ通話も、さらにはグループ通話でさえも、あなたの端末にはつながりません。第1部:アカウント削除とアンインストールの違いヘビーユーザーであれば、「アプリを消して静かな時間を取り戻したらどうなるだろう」と思ったことがあるはずです。昨今のSNSアプリは通知が絶えず鳴り響き、非常に煩わしいものです。テ