構文

【JavaScript】関数の引数を変数として使用してはいけない理由

更新日:2023/07/18

JavaScriptは関数の引数を変数として使用するのは、避けた方がいいです。
その理由をお伝えします。

 

関数の引数を変数として使用する例

まずは、関数の引数を変数として使用する例を挙げてみます。

const func = function(start,end){
    while( start < end ){
        // 何らかの処理
        start ++;
    }
}
func( 1, 10 );

上のコードは、引数として受け取ったstartの値を変数のように変更しています。
変数として使用しない場合、次のようなコードになります。

const func = function(start,end){
    let count = start;
    while( count < end ){
        // 何らかの処理
        count ++;
    }
}
func( 1, 10 );

カウント用の変数を宣言するのは、少しムダに感じますね。

 

関数の引数を変数として使用してはいけない理由

実は引数の変数使用は、パフォーマンス的な理由から推奨されません。

なぜなら、関数は自動的にargumentsという名前の変数が作成され、引数の変更と連動するからです。

const func = function(start,end){
    while( start < end ){
        console.log( start , arguments );
        // 何らかの処理
        start ++;
    }
}
func( 1, 10 );

実行すると、次のような結果になります。

1 [Arguments] { '0': 1, '1': 10 }
2 [Arguments] { '0': 2, '1': 10 }
3 [Arguments] { '0': 3, '1': 10 }
4 [Arguments] { '0': 4, '1': 10 }
5 [Arguments] { '0': 5, '1': 10 }
6 [Arguments] { '0': 6, '1': 10 }
7 [Arguments] { '0': 7, '1': 10 }
8 [Arguments] { '0': 8, '1': 10 }
9 [Arguments] { '0': 9, '1': 10 }

argumentsはオブジェクトで、引数の値が順番にセットされています。
引数startを変更すると、argumentsの値も変更されているのがわかります。

プログラムコードでargumentsを使用しない場合、とてもムダな処理が裏で行われていることになりますね。

今回のような数回のループならパフォーマンスの低下は微々たるものです。
しかし、回数が増えるごとにパフォーマンスが低下していきます。

変更回数が数回に限定されるなら問題ありませんが、不特定回数のループ等での使用は控えた方がよいですね。

 

連動は限定的

前項で引数とarguments変数が連動すると書いていますが、実際は 非strictモード、かつ、functionキーワードで定義のときだけ連動します。

非strictモードは関数内でargumentsが生成されますが、引数と連動しません。
前項のコードを非strictモードに変更します。

"use strict";
const func = function(start,end){
    while( start < end ){
        console.log( start , arguments );
        // 何らかの処理
        start ++;
    }
}
func( 1, 10 );

結果は次のようになります。

1 [Arguments] { '0': 1, '1': 10 }
2 [Arguments] { '0': 1, '1': 10 }
3 [Arguments] { '0': 1, '1': 10 }
4 [Arguments] { '0': 1, '1': 10 }
5 [Arguments] { '0': 1, '1': 10 }
6 [Arguments] { '0': 1, '1': 10 }
7 [Arguments] { '0': 1, '1': 10 }
8 [Arguments] { '0': 1, '1': 10 }
9 [Arguments] { '0': 1, '1': 10 }

アロー関数はargumentsが生成されません。
アロー関数内でargumentsを参照すると、関数外部の同名変数が参照されます。

 

理解して使用すればOK

タイトルで「関数の引数を変数として使用してはいけない」と書いていますが、そんなことはありません。
ようするに、引数とargumentsの関係を理解して使いましょうということですね。

更新日:2023/07/18

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。