質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

3220閲覧

仮引数名と実引数名はどうして別の名前にしなければいけないのですか?

asada88

総合スコア7

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/08/21 14:11

前提

javascriptの超初学者です。

関数を勉強していて思うのですが、どうして仮引数と実引数を同じ引数名にしないのでしょうか?
同じ引数名にしても問題なくコンソールには出力されたのですが、どのテキストにも別名で書かれているようです。
もし引数が数字であるのなら違っていても仕方がないとは思うのですが・・。
稚拙な質問ですが、教えていただけないでしょうか。
よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

function sumCard(card) {
let total = 0;
for(let i = 0; i < card.length; i++) {
total += card[ i ];
}
console.log(total);
}
let myCard = [1, 2, 3, 4];
sumCard(myCard);

### 試したこと 実引数の(myCard)を仮引数の(card)という名称に統一してみました。 ### 補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

どのテキストにも別名で書かれているようです。

テキストは、両者が別物であることを示すため、あえて違えてあるものと思われます。

投稿2022/08/21 14:18

maisumakun

総合スコア146543

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/08/21 14:19

テキストがテキストであるゆえの事情です。
asada88

2022/08/22 06:05

皆さん、ご教授ありがとうございました。 私もあれからいろいろとググってみたのですが、思い当たったのはもし同じ変数名であったのならば、データに変更が生じた場合、全ての引数を更新していかなければならないということでした。 それは関数を使用するという目的?ではないなと思い当たったのです。 皆様の回答を読んで、テキストであるから・・というのもかなり腑に落ちました。 ありがとうございました。
guest

0

もう解決している質問に対して余分な回答にはなりますが、私の考えを示します。

既に出ている回答

テキストだから

これは私も理由の一つだと思います。
同じにしないといけないという誤解を発生させないためには有効な手立てです。

グローバル変数だから

グローバル変数か否かは、理由としては弱いと思います。
今回のコード例ではmyCardは確かにグローバル変数なのでそこは注意しなくてはなりません。

しかし以下の様に、実行側も関数化されていて変数のスコープが共有されていない場合はどうでしょうか?

js

1function sumCard(card) { 2 let total = 0; 3 for(let i = 0; i < card.length; i++) { 4 total += card[ i ]; 5 } 6 console.log(total); 7} 8 9function main(){ 10 let myCard = [1, 2, 3, 4]; 11 sumCard(myCard); 12} 13 14main()

cardmyCardは別々の関数に閉じているためスコープの誤解等は発生しません。
myCardcardと名付けても問題ないように思えます。

私の回答

cardは文脈が存在せず、myCardには存在しているから

sumCardの仮引数(card)

sumCardでは、cardがどんな意図で作られてどんな意味を持つかには関心がありません。
ルール(今回は数字)に従っているカードであれば何でもいいから合計を出力するだけです。
この変数は唯のカードでしか無く、〇〇なカードといった文脈は持っていません。
なのでcardと名付けるのが自然です。

呼び出す際の実引数(myCard)

呼び出す側がsumCardにわたすカードは何らかの文脈や意味を持つことが多いです。
※今回は本当に短いコードなので感じられませんが

  • 私のカード
  • お母さんのカード
  • 捨てられたカード

この様に何らかの文脈によって実体化されたカードなので、唯のcardではなく**Cardと名付けるのはとても理にかなっています。

もしここでの変数名がcardだけだったら、このカードは何のためのカードなのかを他のコードまで手を伸ばして確認する必要が出てくるかもしれません。

変数名(や関数名)を見ればコードの意図がある程度わかると親切です。

投稿2022/08/23 06:51

k4a

総合スコア983

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asada88

2022/08/23 13:00

とてもご丁寧にお答えくださってありがとうございます。 私の能力が足らず、理解ができましたとは言えないのですが、引数名が違っている方が便宜が良いと受け取りました。違っていましたら申し訳ないです・・。 私の考えた答えですが、(同じ変数名であったらば、データに変更が生じた場合、全ての引数を更新していかなければならない。それは関数を使用する意味がないなと思い当たった)というのは間違いではないでしょうか? これ以上の長いコードを書いて、理解できている皆様方は本当にすごいですね! ありがとうございました。
k4a

2022/08/23 13:20

> 同じ変数名であったらば、データに変更が生じた場合、全ての引数を更新していかなければならない。それは関数を使用する意味がないなと思い当たった 内容を上手く把握できないのですが、同じ変数名だったとしても、何かの変更に合わせて全ての引数を更新しなければいけないなんて事はありません。 myFunc関数内で何らかの変更をする必要が出たならそこだけで変更すればよいですし、呼び出す側でも同様です。逆にカードの仕様自体が変わった(例:数字から文字列になった)のなら、変数名にかかわらず関係する処理は全て更新する必要が出てきます。 今回の例に限って言えば、変数名が何であろうと(同じでも違くても)今後の動作や変更に影響は出ません。
asada88

2022/08/23 22:19

なるほど・・。 尻尾をつかんだとと思ったのに逃げられた気分です。 正直、k_a様が書かれていた function sumCard(card) { let total = 0; for(let i = 0; i < card.length; i++) { total += card[ i ]; } console.log(total); } function main(){ let myCard = [1, 2, 3, 4]; sumCard(myCard); } main(); も、なんでfunction main() {と関数にしたのだろう?と疑問は残ります。ですが、どのテキストのどのコードを見てもいちいちつまずいていますので、もう先に進めるしかないですね。 jsを日本語化にしようとすると、上に行ったり、下に行ったりして読んでいるのですが、書くとなるともちろん上からですよね?ということは一瞬でどこを変数にして、どこを関数にして、どこをイベントにしてと一発で判断しているということですよね? 本当に尊敬します。 とても幼稚な疑問なのですがteratailで今度はこの質問もしてみたいと考えていたところなのです。 ありがとうございました!
guest

0

初学者向けのテキストに掲載されているサンプルコードであるという背景を考慮すると、

  • 仮引数と実引数が同じ名前のサンプルコードを載せてしまうと、読者に「このコードによると、仮引数と実引数は同じ名前でなければならないのだな。」と誤解される可能性がある

という点もあるかと思います。

投稿2022/08/22 04:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

同じ変数名(識別子)を使いまわしてもいいんですけど、
使い回すのが当たり前だと思ってほしくなくて
変数(識別子)のスコープを意識してほしい意図があるのかもしれません。

投稿2022/08/22 02:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

「グローバル変数」(JavaScriptにもあります)でなければ変数名が同じでも動作的には問題ないです。
ただ、よくわからないうちは変数名が実引数なのか仮引数なのかがごっちゃになりそうとは思います。
またグローバル変数と同じ名前の仮引数を設定すると関数内ではその名前の変数は仮引数となるのでグローバル変数であることを期待して扱うと意図と違う動作をするかもしれません。
まぁそもそもグローバル変数自体基本的に非推奨とはされていますが。

投稿2022/08/21 14:27

RiaFeed

総合スコア2703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問