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
つまり:
通常モードでは
aとarguments[0]は同じ「実体」を見ている。
strict mode(厳格モード)の arguments の挙動
strict mode では、この「リンク関係」が完全に切られます。
つまり:
aとarguments[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 |
|---|---|---|
a と arguments[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 パラメータを使うのがベスト。
