JavaScript | arguments と strict mode の関係

JavaScript JavaScript
スポンサーリンク

arguments オブジェクトは 「通常モード」と「strict mode(厳格モード)」 で挙動が変わります。
これは初心者がつまずきやすいポイントなので、やさしく整理して説明します。


まず前提:strict mode(厳格モード)とは?

strict mode は、JavaScript の「ゆるいルール」を厳しくして、
安全でバグの少ないコード にするためのモードです。

有効化するには関数やファイルの最初に次の1行を書きます:

'use strict';
JavaScript

例:

'use strict';
function test() {
  // この関数内は厳格モード
}
JavaScript

通常モード(非 strict)の arguments の挙動

通常モードでは、arguments と関数の引数変数が「リンク(同期)」しています。

つまり:

  • arguments[0] の値を変えると、対応する引数変数(たとえば a)も変わる
  • 引数変数を変えると、arguments の中身も変わる

ちょっと混乱する例を見てみましょう。

function demo(a, b) {
  console.log(arguments[0]); // → 1
  a = 99;
  console.log(arguments[0]); // → 99 ← aを変えたらargumentsも変わる
  arguments[1] = 77;
  console.log(b);            // → 77 ← argumentsを変えたらbも変わる
}
demo(1, 2);
JavaScript

🟢 結果(通常モード)

1
99
77

つまり:

通常モードでは aarguments[0] は同じ「実体」を見ている。


strict mode(厳格モード)の arguments の挙動

strict mode では、この「リンク関係」が完全に切られます。

つまり:

  • aarguments[0] は別物。
  • 一方を変えてももう一方には影響しません。

例:

'use strict';
function demo(a, b) {
  console.log(arguments[0]); // → 1
  a = 99;
  console.log(arguments[0]); // → 1 ← aを変えてもargumentsは変わらない
  arguments[1] = 77;
  console.log(b);            // → 2 ← argumentsを変えてもbは変わらない
}
demo(1, 2);
JavaScript

🔴 結果(strict mode)

1
1
2

なぜ strict mode ではリンクを切るの?

理由はシンプルで、

「値が勝手に同期する」のは予期せぬバグを生むからです。

たとえば、引数を変更するつもりがなかったのに、
arguments 経由で値が変わってしまうことがありました。
strict mode ではこの“裏でこっそり動く魔法”を禁止しています。


📘 まとめ表

挙動通常モードstrict mode
aarguments[0] はリンクしている?✅ はい(同期する)🚫 いいえ(別物)
arguments.callee 使える?⚠ 使える(非推奨)❌ 使うとエラー
arguments の内容を変えると引数変わる?✅ 変わる🚫 変わらない
セキュリティ/予期せぬ動作防止❌ 弱い✅ 強化される

💡 これからのおすすめ

  • 新しいコードでは arguments よりも ...rest を使う方が安全でわかりやすい。
  • strict mode が**デフォルトになる環境(モジュールなど)**では、そもそもリンクは無効。
'use strict';
function sum(...args) {  // ← restパラメータなら常に安全
  return args.reduce((a,b) => a + b, 0);
}
console.log(sum(1,2,3)); // 6
JavaScript

まとめ

✅ 通常モードでは arguments と引数がつながっている。
🚫 strict mode では「別物」になり、互いに影響しない。
💡 だから今は基本的に rest パラメータを使うのがベスト。

タイトルとURLをコピーしました