Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

関数と宣言: 引数の個数について #588

Closed
1 task
c01o opened this issue Dec 14, 2018 · 4 comments · Fixed by #605
Closed
1 task

関数と宣言: 引数の個数について #588

c01o opened this issue Dec 14, 2018 · 4 comments · Fixed by #605
Labels
Status: Proposal 提案段階の状態

Comments

@c01o
Copy link
Contributor

c01o commented Dec 14, 2018

該当ページ

リクエスト/提案内容

javascriptでは、引数によって関数が区別されません。例えば、ループと配列節のサンプルに見られるように

function isEven(number) {
return number % 2 === 0;
}
const numbers = [1, 5, 10, 15, 20];
console.log(numbers.some(isEven)); // => true

とでき、余った引数はargumentsに詰められるか、アロー関数の場合は単に捨てられます。

しかし、このことについて「関数と宣言」節を含むこれ以前のページで解説がありません。
特に上述した例では、Array#some(currentValue, index, array) => {}の形のコールバック関数を取ると説明された直後なので、混乱を招きかねないように思います。

期待する結果

「関数と宣言」節、ないし他の適当な場所で解説する

@azu azu added the Status: Proposal 提案段階の状態 label Dec 14, 2018
@azu
Copy link
Collaborator

azu commented Dec 14, 2018

  1. 関数の仮引数以上の引数が渡されたときの挙動
  2. コールバック関数の書き方について(匿名関数を利用しないで、関数を宣言して渡すのも同じ意味という話)

の2つの説明があればわかりやすいような気がしますね。

  1. は関数と宣言のところで仮引数以上の引数のケースについての話を入れる(単に値を受け取れないという話)
  • イメージ的には可変長引数のところで、仮引数の個数より数が多いケースを受け取るにはどうすればいいでしょうか => ...args を使いましょう的な話になるのかな
  • argumentsには常にすべて入るという話は、ユースケース的に結構特殊なので話としては省いていいかな
  1. はコールバックのところで、明示的に説明する(してなかったかも?)

@c01o
Copy link
Contributor Author

c01o commented Dec 14, 2018

@azu
関数の型に厳密だったりオーバーロードが存在したりする言語の経験者が混乱することを懸念しています。ですので、1.については

単に値を受け取れないという話

よりもう少し踏み込んで、「仮引数の個数が型を定めるわけではない」みたいな話にしたほうが良い気もします。(個数が少ない場合undefinedになる話は本書の範囲外か?)

2.については想定外の論点でした。関数が1st class objectであることは明記されているので、それで大丈夫ではないでしょうか

@yumetodo
Copy link
Contributor

(個数が少ない場合undefinedになる話は本書の範囲外か?)

それだとoptionalな引数はどう説明するのでしょうか?

@azu
Copy link
Collaborator

azu commented Dec 15, 2018

📝

  • オーバーロードはJavaScriptになく、あくまで関数名でしか区別されない
    • TypeScriptにはあるから明示しておくとよさそう
    • 関数シグネチャという概念自体はあるが、シグネチャが異なるものが定義できるのではなく、あくまで関数名でしか区別されない(varとfunction宣言だと後勝ちとかそういうのはおいておくとして)
  • 定義した関数のシグネチャと呼び出し方が異なる場合にどうなるかの説明をする
    • これが実行までいけてしまうのがそもそも動的言語っぽさが強い気がするので、RubyとかPythonあたりを参考に考える
    • たりないばあい、おおすぎるばあい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Proposal 提案段階の状態
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants